如何在Django中从编辑表单更新对象?

Her*_*aaf 49 django django-forms

可能是一个新手问题,所以请耐心等待.

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

第一个问题:在隐藏字段中拥有对象的id是正确的方法吗?

我(可能毫无根据)担心只将它作为url的一部分,然后有人可以打开一个对象id的页面,将表单提交给另一个,然后该对象将被覆盖.这就是我试图使用隐藏字段的原因.

将id存储在隐藏字段中的问题在于,在验证表单时,Django抱怨该对象没有唯一的id(显然).

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

Mik*_*bov 94

你为什么不只使用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 render(request, 'my_template.html', {'form': form}) 
Run Code Online (Sandbox Code Playgroud)

  • 太棒了 - 这就是我失踪的`instance`参数.伟大的万维网似乎缺乏关于在Django中使用表单编辑对象的教程. (6认同)

小智 11

更新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})  
Run Code Online (Sandbox Code Playgroud)

  • 接受的答案和这个答案之间的区别是什么? (5认同)