1

Django 文档提到模型 AutoField 不会在使用 ModelForm 构建的表单中表示。

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

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

非常感谢

艾蒂安

4

2 回答 2

4

您可以通过在instance=<>使用时指定参数来做到这一点ModelForm。在此处的文档中了解更多信息

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

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如您所提到的注入隐藏字段。

于 2013-10-10T15:16:52.317 回答
2

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

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

或者

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

然后,您将设置您的 urls.py 以将该参数传递给您的视图,您将在其中使用 karthkir 提供的示例(我将使用主要的示例作为此处的示例)

网址.py

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

视图.py

def myview(request, pk):
    obj_to_edit = MyModel.objects.get(id=pk)
    ...
于 2013-10-10T15:35:45.833 回答