说我有一个看起来像这样的表格:
forms.py
class CreateASomethingForm(ModelForm):
class Meta:
model = Something
fields = ['field2', 'field3', 'field4']
我希望表单包含这三个字段。不过,我的Something
课程也有field1
。我的问题是 - 如果我没有使用field1
来收集数据,如何将数据添加到ModelForm
。我尝试过做这样的事情,但它不起作用,我不确定正确的方法来解决这个问题:
views.py
def create_something_view(request):
if (request.method == 'POST'):
# Create an object of the form based on POST data
obj = CreateASomething(request.POST)
# ** Add data into the blank field1 ** (Throwing an error)
obj['field1'] = request.user
# ... validate, save, then redirect
我收到的错误是:
TypeError: 'CreateAClassForm' object does not support item assignment
在Django中,在保存之前将数据分配给ModelForm
对象的正确方法是什么?
答案 0 :(得分:50)
form = CreateASomething(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.field1 = request.user
obj.save()
答案 1 :(得分:6)
有时,可能需要该字段,这意味着您无法通过form.is_valid()。在这种情况下,您可以将包含所有字段的dict对象传递给表单。
if request.method == 'POST':
data = {
'fields1': request.user,
'fields2': additional_data,
}
form = CreateASomethingForm(data)
if form.is_valid():
form.commit(save)
答案 2 :(得分:2)
Django官方提供了两种方法 链接:https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/
方法1]
author = Author(title='Mr')
form = PartialAuthorForm(request.POST, instance=author)
form.save()
方法2]
form = PartialAuthorForm(request.POST)
author = form.save(commit=False)
author.title = 'Mr'
author.save()
答案 3 :(得分:1)
这是一种更适合添加测试期间使用的数据的方法:
首先将现有条目转换为具有model_to_dict
函数
from django.forms.models import model_to_dict
...
valid_data = model_to_dict(entry)
然后将新数据添加到此词典
valid_data['finish_time'] = '18:44'
这比在表单
中设置值更有效update_form.finish_time = '18:44'
使用有效数据和实例
创建表单update_form = UserEntryForm(valid_data, instance=entry)
执行您需要的任何断言:
self.assertTrue(update_form.is_valid())
entry = update_form.save()
self.assertEqual(
entry.status,
1
)