2012-03-05 4 views
0

ModelFormでシンプルなCUD(Create/Update/Delete)ビューを作成しようとしていますが、モデルフォームに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とともに隠しフィールドを挿入しないので、保存時に新しい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)) 
関連する問題