保存前将数据添加到ModelForm对象

时间:2013-06-15 19:07:24

标签: django django-forms django-views

说我有一个看起来像这样的表格:

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对象的正确方法是什么?

4 个答案:

答案 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
)