Получение ModelForm для вставки скрытого поля для идентификатора (предотвращение дублирования экземпляра при сохранении) - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь создать простое представление CUD (создание / обновление / удаление) с помощью ModelForm, но при сохранении получаю дублирующую запись:

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) не вставляет скрытое поле с идентификатором ответа, поэтому при сохранении создает новое. Какой шаблон лучше всего использовать для этой цели, под Django 1.3?

Ответы [ 2 ]

0 голосов
/ 07 мая 2012

Кажется, что "очевидный" способ обновления 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))
0 голосов
/ 07 мая 2012

В настоящее время вы передаете только экземпляр по GET. Если вы хотите обновить существующую запись при сохранении, вы должны также передать экземпляр в POST.

...