【问题标题】:form_valid method in django-extra-views. In reality form(s)_validdjango-extra-views 中的 form_valid 方法。实际形式_valid
【发布时间】:2019-08-29 12:40:29
【问题描述】:

我正在尝试使用 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, ))

除了 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())


【问题讨论】:

    标签: django django-forms django-views django-authentication


    【解决方案1】:

    非常感谢 Django Extra Views 的作者,因为他们添加了特殊方法而不是 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())
    

    【讨论】:

    • 感谢您的回答,它有效。如果许多表单集中的一个失败会发生什么?如果其中任何一个无效,我们可以返回 form_invalid 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多