如何更新Django的编辑窗体中的对象?

可能是一个新手问题,所以请忍受我。

我有一个Django窗体,编辑模型的某个实例。 为了知道哪个对象正在编辑,我有一个隐藏的字段,包含对象的id,以及包含id的URL。

第一个问题 :隐藏域中的对象的id是否是正确的方法?

我(可能是没有根据的)关心它只是作为URL的一部分,有人可以打开一个对象id的页面,提交表单到另一个,然后这个对象将被覆盖。 这就是为什么我试图使用一个隐藏的领域。

将id存储在隐藏字段的问题是,在validation表单时,Django抱怨对象没有唯一的id(显然)。

第二个问题 :如果一个唯一的字段是表单的一部分,那么如何告诉Django忽略该键已经存在的事实,以便更新对象?

你为什么不使用ModelForm?

 # forms.py # ... class MyForm(forms.ModelForm): class Meta: model = MyModel # views.py # ... def my_view(request, id): instance = get_object_or_404(MyModel, id=id) form = MyForm(request.POST or None, instance=instance) if form.is_valid(): form.save() return redirect('next_view') return direct_to_template(request, 'my_template.html', {'form': form} 

更新Django 1.6和更高版本

 # forms.py # ... class MyForm(forms.ModelForm): class Meta: model = MyModel # views.py def my_view(request, id): instance = MyModel.objects.get(id=id) form = MyForm(request.POST or None, instance=instance) if form.is_valid(): form.save() return redirect('next_view') return direct_to_template(request, 'my_template.html', {'form': form})