2012-03-05 53 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))