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'没有出现在已清理的数据中。
您能帮我理解为什么不保存这些字段的数据吗?
答案 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())