Идиома, чтобы использовать ту же функцию для создания или редактирования объекта?


Вот скелет мой (первый!) Приложение Django:

# models.py
class Task(models.Model):
    description = models.CharField(max_length = 200)
    ...

# forms.py
class AddTaskForm(forms.ModelForm):
    class Meta:
        model = Task

Затем я создал два представления, используя AddTaskForm: один, чтобы создать новый экземпляр, другой для редактирования существующего. Я был в состоянии переработать эти две точки зрения (и функцию они называют), но я не уверен, что я получил наилучший результат...

# urls.py:
(r'^yata/add_task/$',              'yata.views.edit'),
(r'^yata/(?P<task_id>\d+)/edit/$', 'yata.views.edit'),

# views.py
def edit(request, task_id = None):
    t = get_object_or_404(Task, pk=task_id) if task_id else None
    if request.method == 'POST':
        form = AddTaskForm(request.POST, instance=t)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/yata/')
    else:
        form = AddTaskForm(instance = t)

    # Either the form was not valid, or we've just created it
    d = {'form': form}
    if task_id:
        # The template needs the id to decide if the form's action
        # is .../add_task or .../{{id}}/edit
        d['id'] = t.id
    return render_to_response('yata/edit.html', d, 
        context_instance=RequestContext(request))

А вот соответствующие части шаблона:

# edit.html
{% if id %}
    <form action="/yata/{{ id }}/edit/" method="post">
{% else %}
    <form action="/yata/add_task/" method="post">
{% endif %}
{{ form.as_p }}
<input type="submit" value="Save!" />
</form>

Есть ли лучший идиома Джанго, чтобы справиться с этим 'добавить или создать проблему? Или это можно считать правильно?



1750
10
задан 28 января 2011 в 02:01 Источник Поделиться
Комментарии
1 ответ

Я посмотрел на свой код и думаю, что это на самом деле выглядит довольно чистой и прямой. Тем не менее, я хотел бы предложить вам сделать ее более сухой с помощью обратного() , чтобы выяснить, какое действие назначить к форме.

views.py:

if task_id:
action = reverse(edit, args=[task_id])
else:
action = reverse(edit)
d['action'] = action

edit.html:

<form action="{{ action }}" method="post">
{{ form.as_p }}
<input type="submit" value="Save!" />
</form>

2
ответ дан 28 января 2011 в 10:01 Источник Поделиться