Представление на основе классов, расширяющее UpdateView, неправильно сохраняющее форму - PullRequest
6 голосов
/ 05 мая 2011

Я пытаюсь сохранить форму с помощью UpdateView в Django 1.3 и, похоже, столкнулся с проблемой.Когда я сохраняю форму, она отправляет POST на текущий URL, а URL-адрес успеха совпадает с URL-адресом.

При сохранении формы данные изменяются, поскольку все поля на странице обновлены, нокогда я обновляюсь, кажется, что все возвращается.

Форма - это форма модели, и вот мое мнение:

class UserProfileView(UpdateView):
    context_object_name = 'profile'

    def get_template_names(self):
        return ['webapp/user_profile.html']

    def get_queryset(self):
        pk = self.kwargs.get('pk', None)

        if pk is not None:
            user = User.objects.get(pk=pk)
        else:
            raise AttributeError(u"Could not locate user with pk %s"
                             % pk)

        if user.contributor_profile.all():
            queryset = Contributor.objects.filter(user__pk=pk)
        else:
            queryset = Member.objects.filter(user__pk=pk)

        return queryset

    def get_object(self, queryset=None):
        if queryset is None:
            queryset = self.get_queryset()

        return queryset.get()

Я не вижу, что может пойти не так, поскольку Джанго спасаетформа через класс UpdateView и Mixin, который он расширяет.Кто-нибудь сталкивался с этой проблемой раньше?

1 Ответ

9 голосов
/ 06 мая 2011

разобрался с решением. Проблема возникла из-за ошибки в форме, о которой не сообщалось. Похоже, это происходит со скрытыми полями, которые необходимо каким-то образом установить, чтобы форма была действительной.

Решение довольно простое. Вам просто нужно переопределить функцию post и учесть любые скрытые поля:

def post(self, request, *args, **kwargs):
    pk = self.kwargs.get('pk', None)

    if pk is not None:
        user = User.objects.get(pk=pk)
    else:
        raise AttributeError(u"Could not locate user with pk %s"
                             % pk)

    if user.contributor_profile.all():
        contributor = Contributor.objects.get(user=user)
        form = ContributorForm(request.POST, instance=contributor)
    else:
        member = Member.objects.get(user=user)
        form = MemberForm(request.POST, instance=member)

    if form.is_valid():
        self.object = form.save()
        return HttpResponseRedirect(self.get_success_url())
    else:
        return self.render_to_response(self.get_context_data(form=form))
...