Проблема метода django ModelForm save () - PullRequest
3 голосов
/ 20 января 2011

У меня есть модель формы:

class SnippetForm(ModelForm):
    class Meta:
        model = Snippet
        exclude = ['author', 'slug']

и я хочу иметь возможность редактировать конкретный экземпляр, используя это:

def edit_snippet(request, snippet_id):
    #look up for that snippet
    snippet = get_object_or_404(Snippet, pk=snippet_id)
    if request.user.id != snippet.author.id:
        return HttpResponseForbidden()
    if request.method == 'POST':
        form = SnippetForm(data=request.POST, instance=snippet)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(snippet.get_absolute_url())
    else:
        form = SnippetForm(instance=snippet)
    return render_to_response(SNIPPET_EDIT_TEMPLATE,
                              {'form':form, 'add':False, 'user':request.user}, 
                              RequestContext(request))

Обратите внимание, что на линии

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

, я создал форму, которая использует данные, предоставленные пользователем, и связал ее с экземпляром, найденным с использованием первичного ключа (полученного из URL). Согласно документации django , когда я вызываю save (), существующий экземпляр должен обновляться данными POSTED. Вместо этого я вижу, что новый объект создается и сохраняется в базе данных. Что пошло не так? Большое спасибо.

[Редактировать] Это действительно смущает. Код действительно не имеет ничего плохого в этом. Единственной вещью, которая испортила все это, было действие, которое я вставил в шаблон (так как я использую тот же шаблон для добавления и редактирования фрагмента) .... Большое спасибо за вашу помощь, очень ценю это.

1 Ответ

1 голос
/ 20 января 2011

Я не понимаю, почему это случилось. Какая версия Django это?

В любом случае вы можете вручную принудительно обновить обновление, передав соответствующий аргумент.

form = SnippetForm(data=request.POST, instance=snippet, force_update=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...