如果使用实例窗体

2024-06-28 19:29:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用通用视图将当前登录的用户作为属性分配给modelform实例的字段。我已经引用了thisSO post并重写了post方法,但它给了我一个错误,CreatedBy字段是必需的。另外,我在ccbv上经历了mro很多次。如下图所示。在

class PostCreate(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostForm
    success_message = "Post Updated"
    success_url = '/home/'

    def get_form(self, form_class=None):
        """
        Returns an instance of the form to be used in this view.
        """
        form = super(PostCreate, self).get_form(form_class)
        form.instance.CreatedBy=User.objects.get(id=self.request.user.id)     
        return form

    def get_initial(self):
        """
        Returns the initial data to use for forms on this view.
        """
        self.initial = {'CreatedBy':  User.objects.get(id=self.request.user.id)}
        return self.initial.copy()

    def get_form_kwargs(self):
        """
        Returns the keyword arguments for instantiating the form.
        """
        kwargs = {
        'initial': self.get_initial(),
        'prefix': self.get_prefix(),
        }
        if self.request.method in ('POST', 'PUT'):
            kwargs.update({
            'data': self.request.POST,
            'files': self.request.FILES,
        })

        return kwargs

我重写所有这些方法的原因是为了检查每个方法中初始dict的可用性。它在所有方法中都可用,但表单验证仍然失败。但我认为最好不要在get_initial(self)中设置值,因为我不会用任何已保存对象的现有数据预填充表单字段,而是希望update a field of an initialized form with User object of logged in user。我已经在ipdb中经历了控制流,但却遇到了同样的错误。在

^{pr2}$

请注意,我不是在寻找被操纵的form_valid(self)方法。 我被这事缠住了好几个小时。任何帮助都是非常感谢的。在


Tags: ofthe方法inselfformidget
1条回答
网友
1楼 · 发布于 2024-06-28 19:29:38

created_by仍然是必需的,因为您没有将其从表单中排除;您需要在PostForm中执行此操作。在

class PostForm(forms.ModelForm):
    class Meta:
        exclude = ['created_by']

至于自动分配,编辑视图上的文档有一个specific section精确地描述了如何做到这一点;您可以覆盖form_valid()

^{pr2}$

相关问题 更多 >