我在Django中使用ModelForm更新时,目标对象的主键在哪里?
我在使用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