Ошибки формы не отображаются в UpdateView - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть UpdateView, который будет отображать форму для создания профиля пользователя или обновления профиля пользователя.Это работает хорошо, однако, по некоторым причинам я не могу заставить это показать ошибки формы.Должны быть ошибки формы, основанные на ValidationErrors, который я поместил в форму модели.Я подозреваю, что мой views.py является причиной того, что форма не отображает ошибки.

Вот мой взгляд:

class ProfileSettings(UpdateView):
    model = Profile
    template_name = 'profile/settings.html'
    form_class = ProfileForm
    success_url = reverse_lazy('profile:settings')

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST, request.FILES)

        if form.is_valid():
            bio = form.cleaned_data['bio']
            gender = form.cleaned_data['gender']
            avatar = form.cleaned_data['avatar']


            Profile.objects.update_or_create(user=self.request.user, defaults={'avatar':avatar, 'bio':bio, 'gender':gender})

        return HttpResponseRedirect(self.success_url)

В шаблоне я отображаю ошибки следующим образом: {{ form.avatar.errors }} где аватар должен отображать ошибку, если изображение слишком маленькое, но это не так.

1 Ответ

0 голосов
/ 02 февраля 2019

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

class ProfileSettings(UpdateView):
    model = Profile
    template_name = 'profile/settings.html'
    form_class = ProfileForm
    success_url = reverse_lazy('profile:settings')

   def form_valid(self, form):
      bio = form.cleaned_data['bio']
      gender = form.cleaned_data['gender']
      avatar = form.cleaned_data['avatar']
      Profile.objects.update_or_create(user=self.request.user, defaults={'avatar':avatar, 'bio':bio, 'gender':gender})
      return HttpResponseRedirect(self.success_url)

Кстати, у этого кода есть и недостатки.Мы не используем форму модели save здесь.Было бы лучше, если бы мы могли это использовать.Первоначально form_valid делает это.

Также в другой заметке, я думаю, что лучше всего использовать сигналов для создания профиля пользователя при каждом создании пользователя.Вот средний пост о том, как это сделать.Таким образом, вам даже не нужно переопределять form_valid.

Обновление

Использование FormView для предварительного заполнения данных:

class ProfileSettings(FormView):
    model = Profile
    template_name = 'profile/settings.html'
    form_class = ProfileForm
    success_url = reverse_lazy('profile:settings')

   def get_form_kwargs(self):
        kwargs = super(ProfileSettings, self).get_form_kwargs()
        kwargs['instance'] = self.request.user.profile  # Profile object
        return kwargs
...