Как перехватить информацию о пользователе во время обновления связанной модели с помощью фабрики inlineformset

Я пытаюсь сохранить ID пользователя в соответствующем поле модели при создании и обновлении пары связанных моделей.

Далее следуют объекты, хотя и усеченные для лучшей читабельности:

models.py

class Plant(BaseTimeStampModel):
    # ....

class Calendar(BaseTimeStampModel):
    calendar_id = models.CharField(primary_key=True, max_length=4)
    short_text = models.CharField(max_length=55, ...
    # ...


class AssignedPlants(BaseTimeStampModel):
    assginment_id = models.CharField(primary_key=True, max_length=4, ...
    plant = models.ForeignKey(primary_key=True...
    calendar = models.ForeignKey(Calendar, related_name= ...
    short_text = models.CharField(max_length=55, ...
    # ...

forms.py

class CreateCalendarForm(forms.ModelForm):
    class Meta:
        model = Calendar
        fields = (...

class CreatePlantAssgnForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(CreatePlantAssgnForm, self).__init__(*args, **kwargs)
        self.auto_id = True

    class Meta:
        model = AssignedPlants
        fields = ...
    exclude = ()

CreateCalendarFormset = inlineformset_factory(
    Calendar,
    AssignedPlants,
    form = CreatePlantAssgnForm,
    extra=0,
    can_delete=True, min_num=1, validate_min=True, max_num=50, validate_max=True,
    )

views.py

class CalendarCreateView(CreateView):
    template_name = ...
    model = Calendar
    form_class = CreateCalendarForm

    success_url = ...

    def get_context_data(self, **kwargs):
        data = super(CalendarCreateView, self).get_context_data(**kwargs)
        if self.request.POST:
            data['calendar'] = CreateCalendarFormset(self.request.POST, self.request.FILES)
        else:
            data['calendar'] = CreateCalendarFormset()
        return data

    def form_valid(self, form):
        form.instance.created_by = self.request.user
        context = self.get_context_data()
        calendar = context['calendar']

        with transaction.atomic():
            if calendar.is_valid():
                self.object = form.save()
                calendar.instance = self.object

                for frmst_form in calendar.forms:
                    f = frmst_form.save(commit=False)
                    f.created_by = self.request.user
                    calendar.save()
                    f.save()

                return redirect(...

            else:
                context.update({'calendar': calendar})
                return self.render_to_response(context)
        return super(CalendarCreateView, self).form_valid(form)

При таком расположении я могу сохранить ID пользователя, создающего новую запись ( как в родительской, так и в дочерних таблицах).

При изменении (обновлении) я пытаюсь сделать вид следующим образом (остальное остается аналогичным):

# ...
        with transaction.atomic():
            if calendar.is_valid():
                self.object = form.save()
                calendar.instance = self.object

                for frmst_form in calendar.forms:
                    f = frmst_form.save(commit=False)
                    f.changed_by = self.request.user    # Field "changed_by" to be updated
                    calendar.save()
                    f.save()

                return redirect(...
# ...

Так вот, при изменении существующей записи я хочу, чтобы поле "changed_by" модели также обновлялось идентификатором пользователя.

Однако, поле "changed_by" в дочерней таблице DB "AssignedPlants" показывает "NULL" (значение поля родительской таблицы при этом обновляется).

ЧТО я делаю неправильно? Как мне обновить значения "changed_by" при "UPDATE" (для дочерней модели тоже)?

Решил проблему. Было довольно просто сделать это в модели save().

Спасибо всем за оказанную помощь.

Вернуться на верх