我在Django中使用ModelForm更新时,目标对象的主键在哪里?

3 投票
4 回答
8858 浏览
提问于 2025-04-16 01:17

我在使用Django的modelform来插入和更新数据库中的对象,但在尝试更新时,我看不到要更新的对象的主键/id:

这是我的模型:

class Category(models.Model):
    name = models.CharField(max_length=20, db_index = True)

这是我的表单:

class CategoryForm(ModelForm):
    class Meta:
        model = Category
        fields = ['name']

在我的模板中,我得到了:

{% csrf_token %}
{{ category_form.as_p  }}

在我的视图中,我做了:

cat = Category.objects.get(pk = cat_id)
data['category_form'] = CategoryForm(instance = cat)

然后把数据传递给我的模板,模板也能正确渲染表单,但我发现要更新的对象的id在HTML源代码中根本找不到。那么代码怎么知道要更新哪个对象呢?

我觉得问这个问题有点傻,因为这应该是很基础的内容,但我已经看过所有的教程,查阅了Django的文档,还在网上搜索了很久,还是没有找到答案。

提前谢谢大家。

4 个回答

4

这个问题的解释可以在Django的文档中找到,链接在这里:http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

当你想要更新已经保存的数据时,在重新创建表单的时候,你必须提供一个实例参数。否则,Django会尝试插入一个新的数据。

foo_form = FooForm(request.POST, instance=foo)
4

在你的视图中,cat_id 是从哪里来的呢?我猜它是通过网址传过来的,像这样:

url( r'categories/(\d+)/edit/', your_view, {} ),

在某个 urls.py 文件里。现在在你的视图中,你可以从相应的视图函数参数中读取它:

def your_view( request, cat_id ):

现在你可以根据正确的 ID 获取对象,这里就是这样做的:

cat = Category.objects.get(pk = cat_id)

...然后如果你想编辑一个已经存在的对象,就把 cat 对象传给 ModelForm,如果你想创建一个新的对象,就不传这个对象,这样就会得到一个空的表单。

0

主键是你实例对象“cat”上的一个属性,叫做“id”。在你的例子中,表单里用“cat_id”来表示这个主键。模型表单会自动处理主键的跟踪,你只需要把得到的“request.POST”数据传回到CategoryForm中,使用is_valid()来验证数据,然后保存就可以了。

也就是说:

form_with_post = CategoryForm(request.POST)
if form_with_post.is_valid():
    form_with_post.save()
else:
    ... return the form_with_post through the context to display the errors

撰写回答