Практические проекты Джанго - страницы 183 и 184 - PullRequest
1 голос
/ 02 мая 2011

На страницах 183 и 184 есть следующий код:

def edit_snippet(request, snippet_id):
    snippet = get_object_or_404(Snippet, pk=snippet_id)
    if request.user.id != snippet.author.id:
        return HttpResponseForbidden()
    if request.method == 'POST':
        form = SnippetForm(instance=snippet, data=request.POST)
        if form.is_valid():
            snippet = form.save()
            return HttpResponseRedirect(snippet.get_absolute_url())
    else:
        form = SnippetForm(instance=snippet)
    return render_to_response('cab/snippet_form.html',{ 'form': form, 'add': False })
edit_snippet = login_required(edit_snippet)

Почему необходимо добавить здесь атрибут данных:

form = SnippetForm(instance=snippet, data=request.POST)

Не достаточно ли атрибута экземпляра?

Если метод запроса не POST, тогда это может быть что угодно, но обычно это метод GET.Почему в этом случае нет атрибута данных?Почему необходимо учитывать другие методы запроса?Не могли бы мы просто написать:

def edit_snippet(request, snippet_id):
    snippet = get_object_or_404(Snippet, pk=snippet_id)
    if request.user.id != snippet.author.id:
        return HttpResponseForbidden()
    if request.method == 'POST':
        form = SnippetForm(instance=snippet, data=request.POST)
        if form.is_valid():
            snippet = form.save()
            return HttpResponseRedirect(snippet.get_absolute_url())
    return render_to_response('cab/snippet_form.html',{ 'form': form, 'add': False })
edit_snippet = login_required(edit_snippet)

Мне кажется более логичным не позволять пользователю редактировать свой фрагмент, если метод запроса не POST.Можете ли вы объяснить мне эти моменты?

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

Это способ сделать Джанго: это же представление используется для отображения формы для редактирования (GET) и затем для проверки ее (POST).

См. Этот пример в документах :

Стандартный шаблон для обработки Форма в виде выглядит так:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })
1 голос
/ 02 мая 2011

Функция edit_snippet обрабатывает как (1) запрос GET для отображения формы для редактирования объекта, так и (2) последующий запрос POST, когда пользователь сохраняет свои изменения в форме.

Св связи с этим имеет смысл для случая без POST просто заполнить форму из переменной «сниппет», которая была получена из базы данных;как вы заметили, в этом случае нет параметра «data».То, что было в базе данных, будет отображаться пользователю.

Однако, когда пользователь сохраняет форму, в случае POST переменная «фрагмент» будет содержать только то, что было получено из базы данных.Устанавливая параметр «data» для содержимого полей формы (request.POST), которые были опубликованы пользователем, вы позволяете форме (1) сохранять пользовательские изменения из request.POST в объекте, а затем (2)) утвердите эти изменения.

...