2011-01-12 81 views
36

可能是一个新手问题,请耐心等待。如何从Django中的编辑窗体更新对象?

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

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

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

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

第二个问题:如果一个独特的领域是一种形式的一部分,一个人如何告诉Django忽略那个键已经存在,为了更新对象的事实?

+0

你能告诉我你的形式? PS:是的,没有安全措施(权限),任何人都可以访问`/ edit/{{id}} /`并且是危险的。 – 2011-01-12 21:10:00

+1

好吧,我确实有保护措施,例如检查对象是否属于登录用户 - 但即使如此,该用户(出于某种原因未知)可以编辑一个意外对象。 – 2011-01-12 21:11:08

回答

63

为什么不使用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}) 
+3

非常棒 - 这就是我缺少的`instance`参数。伟大的万维网似乎缺少关于在Django中使用表单编辑对象的教程。 – 2011-01-12 21:17:00

8

更新的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}) 
相关问题