首页 文章

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

提问于
浏览
45

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

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

First question :在隐藏字段中拥有对象的id是正确的方法吗?

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

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

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

2 回答

  • 86

    你为什么不只使用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})
    
  • 10

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

相关问题