2011-01-12 78 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}) 
相關問題