想要向表单添加数据,表单有效,但数据不在cleaning_data中

时间:2016-08-08 18:02:32

标签: django

Django 1.10

我正在尝试以编程方式向表单添加数据。

class Wiki(models.Model):
    related_model = models.CharField(max_length=100, blank=False, null=False, default="")
    related_object_id = models.CharField(max_length=100, blank=False, null=False, default="")
    article = models.TextField(blank=False, null=False, default="")


class WikiCreate(CreateView):
    model = Wiki
    fields = ['article']

    def post(self, request, *args, **kwargs):
        related_model = kwargs.get('model')
        related_object_id = kwargs.get('pk')

        form = self.get_form()
        form.data._mutable = True
        form.data['related_model'] = related_model
        form.data['related_object_id'] = related_object_id
        form.data._mutable = False

        return super(WikiCreate, self).post(request, *args, **kwargs)

在超类的post方法中,我放置一个断点:

class ProcessFormView(View):
    def post(self, request, *args, **kwargs):
        """
        Handles POST requests, instantiating a form instance with the passed
        POST variables and then checked for validity.
        """
        form = self.get_form()
        if form.is_valid(): # breakpoint
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

那么,我能在断点看到什么。 form.data =

然后进入调试器。 form.is_valid()返回true。所以,现在我可以看到:1)_errors是空的; 2)cleaning_data = {'article':“我刚输入的一些文字。”}。

嗯,'related_model'和'related_object_id'没有出现在已清理的数据中。

您能帮我理解为什么不保存这些字段的数据吗?

2 个答案:

答案 0 :(得分:1)

这是因为你只有字段:

fields = ['article']

因此除了文章之外,您的表单上没有其他字段。尝试将其他两个字段添加到fields数组中。如果您希望它们在那里,但不可见,您需要创建一个自定义表单并将它们设置为隐藏的小部件

答案 1 :(得分:0)

这不是向表单提交添加数据的方法。一旦在form_valid方法中创建了模型实例,就应该将其添加到模型实例中,而不是表单中。你根本不应该覆盖post

class WikiCreate(CreateView):
    model = Wiki
    fields = ['article']

    def form_valid(self, form):
        related_model = self.kwargs.get('model')
        related_object_id = self.kwargs.get('pk')
        item = form.save(commit=False)
        item.related_model = related_model
        item.object_id = related_object_id
        item.save()
        return redirect(self.get_success_url())