Django InlineFormSetFactory или inlineformset_factory для вывода DateField в строковом виде

uropb

Новичок
Пользователь
Ноя 17, 2021
1
0
1
Здравствуйте, подскажите, хочу сделать табель учета рабочего времени для начисления ЗП. Определил модели (дата, ФИО, отработанное время). Вывод сделал через django-extra-views с помощью InlineFormSetFactory вместо встроенного inlineformset_factory, т.к. через inlineformset_factory потом не получалось сохранить измененную форму.
Но меня не устраивает и через 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>
2021-11-16_18-43-57.png
 

Форум IT Специалистов