Как перехватить информацию о пользователе во время обновления связанной модели с помощью фабрики 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().
Спасибо всем за оказанную помощь.