如何更新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})