2012-03-05 28 views
0

我想用ModelForm構建一個簡單的CUD(創建/更新/刪除)視圖,但在保存時出現重複記錄:獲取ModelForm爲id插入隱藏字段(防止保存重複實例)

的ModelForm:

class formFacetAnswer(forms.ModelForm): 
    class Meta: 
     model = models.FacetAnswer 
     exclude = ('who') 

查看:

def xxx_test1(request): 
    if request.method == 'POST': 
     form = formFacetAnswer(request.POST) 
     if form.is_valid(): 
      answer  = form.save(commit=False) 
      answer.who = request.user 
      answer.save() 
      return HttpResponseRedirect('/') 

    else: 
     a_id = request.GET.get('answer') 
     if a_id: 
      a_id=int(a_id) 
      answer = models.FacetAnswer.objects.get(id=a_id) 
      form = formFacetAnswer(instance=answer) 
     else: 
      form = formFacetAnswer() 

    return render_to_response('facet_answer.html', dict(form=form), context_instance=RequestContext(request)) 

模板:

{% extends 'head-plain.html' %} 
{% block content %} 
<form action="" method="post"> 
{% csrf_token %} 
{{ form.as_p }} 
<input type="submit" value="Submit" /> 
</form> 
{% endblock %} 

formFacetAnswer(instance=answer)不會插入帶有答案ID的隱藏字段,因此在保存時會創建一個新的答案。在Django 1.3下使用這種需求的最佳模式是什麼?

回答

0

目前您只在GET上傳遞實例。如果要在保存時更新現有記錄,則還應在POST上傳遞該實例。

0

更新ModelForms時,「顯而易見」的方式似乎是在URL中的對象實例的標識符。

urls.py:

url(r'^answer/(\d+)$', 'app.views.xxx_test1', name='editAnswer'), 
url(r'^answer/$',  'app.views.xxx_test1', name='newAnswer '), 

查看:

def xxx_test1(request, a_id=None): 
    if request.method == 'POST': 
     if a_id: 
      answer = models.FacetAnswer.objects.get(id=a_id) 
      form = formFacetAnswer(request.POST, instance=answer) 
     else: 
      form = formFacetAnswer(request.POST) 
     if form.is_valid(): 
      answer  = form.save(commit=False) 
      answer.who = request.user 
      answer.save() 
      return HttpResponseRedirect('/') 

    else: 
     if a_id: 
      answer = models.FacetAnswer.objects.get(id=a_id) 
      form = formFacetAnswer(instance=answer) 
     else: 
      form = formFacetAnswer() 

    return render_to_response('facet_answer.html', dict(form=form), context_instance=RequestContext(request))