如何使用Django AutoField编辑modelForm?

时间:2013-10-10 15:10:38

标签: python django forms

Django doc提到Model AutoField不会以使用ModelForm构建的形式表示。

编辑并保存该表单时,我应该如何知道底层的AutoField id值,以便将表单数据正确保存到数据库?

我知道我可以在编辑表单中注入一个隐藏字段以了解哪一行已被编辑但是有没有办法让Django自动管理隐藏字段或其他一些机制?

非常感谢

艾蒂安

2 个答案:

答案 0 :(得分:4)

您可以在使用instance=<>时指定ModelForm参数。 有关详情,请参阅documentation here

创建/更新视图的使用示例:

def myview(request, id=None):
    if id:
        obj_to_edit = MyModel.objects.get(id=1)
        form = MyForm(instance=obj_to_edit)
    else:
        obj_to_edit = None
        form = MyForm()

    if request.method == 'POST':
        if id: #update
            form = MyForm(request.POST, instance=obj_to_edit)
        else: #create
            form = MyForm(request.POST)

    #rest of the code

并且URL会有类似的内容:

url(r'/blah/create/', 'myview'),
url(r'/blah/edit/(?P<id>[\d+])/', 'myview')

现在,django明白它需要编辑而不是创建新对象。

另请注意,如果您使用的是forms.Form,则必须手动查询唯一字段,或者按照您的提及注入隐藏的id字段。

答案 1 :(得分:2)

通常在编辑表单时,您要编辑的特定实例将使用主键或段号字段在您的URL中标识,例如:

www.example.com/model/edit/6/

www.example.com/model/edit/object_slug/

然后,您将设置urls.py将该参数传递给您的视图,您将使用karthkir提供的示例(我将使用primary作为示例)

urls.py

urlpatterns = patterns('',
    url(regex=r'^model/edit/(?P<pk>\d+)/$', 'myapp.views.myview', name='add_customer'),
)

views.py

def myview(request, pk):
    obj_to_edit = MyModel.objects.get(id=pk)
    ...