метод form_valid в django-extra-views. В реальности форма (ы)_valid

#django #django-forms #django-views #django-authentication

#django #django-формы #django-views #django-аутентификация

Вопрос:

Я пытаюсь использовать пакет дополнительных представлений Django для создания новой записи на основе модели встроенного набора форм дополнительной информации из пользовательской модели. Я знаю, как это сделать с помощью представлений на основе функций, но теперь пытаюсь уменьшить объем кода:

У меня есть 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
  

Я использую следующий вид для визуализации и сохранения всего этого вместе:

 
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, ))

  

Все это работает, кроме 1 вещи: я не могу назначить текущего пользователя в качестве автора записи, то есть 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())


  

схема наследования

Ответ №1:

Что ж, большое спасибо авторам дополнительных представлений Django, поскольку они добавили специальный метод вместо form_valid …. угадайте, как он называется??? forms_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. спасибо за ответ, он работает. Что произойдет, если 1 из множества наборов форм завершится с ошибкой? Можем ли мы вернуть form_invalid, если какой-либо из них недействителен?