我正在尝试使用ModelForm构建一个简单的CUD(创建/更新/删除)视图,但在保存时我得到一个重复的记录:
的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 :(得分:0)
目前,您只在GET上传递实例。如果你想在保存时更新现有记录,那么你也应该在POST上传递实例。
答案 1 :(得分: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))