让ModelForm为id插入隐藏字段(防止保存时出现重复实例)

时间:2012-03-05 07:59:42

标签: django-forms

我正在尝试使用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下,用于此需求的最佳模式是什么?

2 个答案:

答案 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))