Я пытаюсь использовать пакет Django Extra Views для создания новой записи на основе модели + встроенного набора форм + дополнительной информации из модели USER. Я знаю, как это сделать с помощью представлений на основе функций, но теперь пытаюсь уменьшить объем кода:
У меня есть 2 модели + пользовательская модель:
Model1: # primary model
author = models.ForeignKey("ExtraUser", )
+some fileds
Model2 # secondary model
photo = models.ForeignKey("Model1", )
+ some fields
# user model
Model ExtraUser(AbstractBaseUser)
+ some fileds
Я использую следующий VIEW для рендеринга и сохранения всего вместе:
class ItemInline(InlineFormSetFactory):
model = Model2
fields = ["somefiled"]
class CreateBoatView(SuccessMessageMixin, LoginRequiredMixin, CreateWithInlinesView):
model = Model1
inlines = [ItemInline]
fields = ["list of the fields here"]
template_name = 'create.html'
def get_success_url(self):
return reverse('app:url', args=(self.object.pk, ))
Все работает, кроме одного: я не могу назначить текущего пользователя автором записи, то есть author = models.ForeignKey("ExtraUser", ) всегда NULL
в представлении, основанном на функции предка, я делал следующее:
if form1.is_valid():
prim = form1.save(commit=False)
prim.author = request.user # that is I connect this entry to the current user.
# + do something + save(commit=True) finally.
Как сделать то же самое в CreateWithInlinesView?
попробовал след. Не работаю
def dispatch(self, request, *args, **kwargs):
self.user = request.user
return CreateWithInlinesView.dispatch(self, request, *args, **kwargs)
def form_valid(self, form): #(self, form, inlines)??
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
# super-class form_valid method (for reference)
def forms_valid(self, form, inlines):
"""
If the form and formsets are valid, save the associated models.
"""
self.object = form.save()
for formset in inlines:
formset.save()
return HttpResponseRedirect(self.get_success_url())
Что ж, большое спасибо авторам Django Extra Views, так как они добавили специальный метод вместо form_valid.... угадайте как называется??? form_valid . Вам нужно несколько секунд, чтобы понять разницу, верно?? для меня это заняло около 5 часов, чтобы узнать это.
НАКОНЕЦ:
def forms_valid(self, form, inlines): #yes, f%%ng form(s)_valid, yeh...
"""
If the form and formsets are valid, save the associated models.
"""
self.object = form.save(commit=False)
self.object.author = self.request.user
form.save(commit=True)
for formset in inlines:
formset.save()
return HttpResponseRedirect(self.get_success_url())
спасибо за ответ, работает. Что произойдет, если 1 из многих наборов форм выйдет из строя? Можем ли мы вернуть form_invalid, если какой-либо из них недействителен?