Здравствуйте, подскажите, хочу сделать табель учета рабочего времени для начисления ЗП. Определил модели (дата, ФИО, отработанное время). Вывод сделал через django-extra-views с помощью InlineFormSetFactory вместо встроенного inlineformset_factory, т.к. через inlineformset_factory потом не получалось сохранить измененную форму.
Но меня не устраивает и через InlineFormSetFactory и через inlineformset_factory , что из-за отношений ManyToMany у меня выводит селект даты с возможностью изменения пользователем, а я бы хотел просто в строковом выражении дату, например 17.11.2021 и форма для изменения рабочего времени, т.е. чтобы черновик табеля формировал админ через админку, а пользователь мог за определенное число и определенному человеку только изменить отработанное время.
Но меня не устраивает и через InlineFormSetFactory и через inlineformset_factory , что из-за отношений ManyToMany у меня выводит селект даты с возможностью изменения пользователем, а я бы хотел просто в строковом выражении дату, например 17.11.2021 и форма для изменения рабочего времени, т.е. чтобы черновик табеля формировал админ через админку, а пользователь мог за определенное число и определенному человеку только изменить отработанное время.
Python:
#models.py
class Person(models.Model):
fio = models.CharField(max_length=64, null=True)
oklad = models.DecimalField(max_digits=8, decimal_places=2)
def __str__(self):
return self.fio
class Date_Tab(models.Model):
day_date = models.DateField(
_('ДАТА'),
auto_now=False,
auto_now_add=False,
unique=True,
)
def __str__(self):
date_tab = str(self.day_date)
return date_tab
class DocTimeManage(models.Model):
TABEL = 'T'
GRAFIK = 'G'
TYPE_CHOISES =(
(TABEL, _('ТАБЕЛЬ')),
(GRAFIK, _('ГРАФИК')),
)
type = models.CharField(
_('Тип документа'),
max_length=1,
choices=TYPE_CHOISES,
)
number = models.CharField(
_('Номер'),
blank=True,
max_length=50,
)
created_at = models.DateTimeField(
_('Дата создания'),
auto_now_add=True,
db_index=True,
)
@property
def total(self):
return self.items.aggregate(sum=Sum('workTime'))['sum']
class DocTimeManageItem(models.Model):
document = models.ForeignKey(
DocTimeManage,
models.CASCADE,
related_name='items',
)
date_tabs = models.ManyToManyField(
Date_Tab,
related_name='date_tabs',
)
persons = models.ManyToManyField(
Person,
related_name='persons'
)
workTime = models.DecimalField(
_('Время'),
max_digits=4,
decimal_places=2,
)
Python:
# views.py
class DocInLine(InlineFormSetFactory):
model = DocTimeManageItem
fields = ['date_tabs', 'persons', 'workTime']
factory_kwargs = {'extra': 0, 'can_order': False, 'can_delete': False}
def get_formset_kwargs(self):
kwargs = super(DocInLine, self).get_formset_kwargs()
print('kwargs', kwargs)
instance = kwargs['instance'].pk
return kwargs
class UpdateDocView(UpdateWithInlinesView):
model = DocTimeManage
inlines = [DocInLine]
fields = ['number']
template_name = 'tabel/detail.html'
def get_success_url(self):
return reverse_lazy('tabel:detail', kwargs={'pk': self.get_object().id})
Python:
#detail.html
<form method="post">
{% csrf_token %}
<br>
{% for formset in inlines %}
{{ formset.as_p }}
<br>
{% endfor %}
<input type="submit" value="Submit"/>
</form>