ошибка формы смены пароля не работает на моей html-странице

#django #django-forms #django-templates

Вопрос:

моя html-форма выглядит так

 {% if messages %}
    {% for message in messages %}
        <div class="alert alert-danger" role="alert">
        <strong>{{message}}</strong>
        </div>
    {% endfor %}
    {% endif %}

    {% if form.errors %}
    {% for field in form %}
    {% for error in field.error %}
    <div class="alert alert-danger" role="alert">
        <strong>{{error|escape}}</strong>
    </div>
    {% endfor %}
    {% for error in form.non_field_errors %}
    <div class="alert alert-danger" role="alert">
        <strong>{{error|escape}}</strong>
    </div>
    {% endfor %}
    {% endfor %}
    {% endif %}
 

мой views.py
когда я ввожу неправильные пароли , он перенаправляет меня на ту же страницу, если я не верну другую ее часть is_valid , что приведет к ошибке возврата объекта.
что я могу сделать для отображения ошибки формы во внешнем интерфейсе

 def change_password(request):
    if request.user.is_authenticated:
        if request.method == "POST":
            form = PasswordChangeForm(request.user , request.POST)
            if form.is_valid():
                user = form.save
                update_session_auth_hash(request , user)
                messages.success(request , "Your password is successfully changed")
                return redirect('index')
            else:
                messages.error(request , "Please correct the error below.")
                return redirect('change_password')
        else:
            form  = PasswordChangeForm(request.user)
            return render(request , "change-password.html" , {'form':form})
    else:
        messages.error(request , "Please login to see that page")
        return redirect('login')
 

Комментарии:

1. я сделал » s » в {% для ошибки в поле.ошибка %} , но моя проблема еще не решена

Ответ №1:

Похоже, у вас отсутствует буква «s» в конце этой строки {% for error in field.error %} , которая должна быть ...in field.errors %} в вашем шаблоне.

В views.py заменить redirect(view_name) на:

HttpResponseRedirect(reverse('app_name:view_name'))

 def change_password(request):
    if request.user.is_authenticated:
        if request.method == "POST":
            form = PasswordChangeForm(request.user , request.POST)
            if form.is_valid():
                user = form.save
                update_session_auth_hash(request , user)
                messages.success(request , "Your password is successfully changed")
                return HttpResponseRedirect(reverse('app_name:index'))
            else:
                messages.error(request , "Please correct the error below.")
                return HttpResponseRedirect(reverse('app_name:change_password'))
        else:
            form  = PasswordChangeForm(request.user)
            return render(request , "app_name/change-password.html" , {'form':form})
    else:
        messages.error(request , "Please login to see that page")
        return HttpResponseRedirect(reverse('app_name:login'))
 

Вы также можете заменить эту функцию представлением на основе классов:

 #if user is not logged in 
#then will be redirected to the login page defined in settings.py
@method_decorator(login_required, name='dispatch')
class YourViewName(PasswordChangeView):
    template_name = 'app_name/change-password.html'
    form_class = PasswordChangeForm #You can use custom form here
    success_url = reverse_lazy('app_name:index')

    #add these functions only if you want to add these messages 
    #to default Django messages
    def form_valid(self, form):
        messages.success(self.request , "Your password is successfully changed")

        return super().form_valid(form)

    def form_invalid(self, form):
        messages.error(self.request , "Please correct the error below.")

        return super().form_invalid(form)
 

Комментарии:

1. я сделал это, но моя проблема еще не решена

2. @ManavPrajapati у вас нет никаких ошибок в режиме отладки? Все, что я сделал в views.py должен был заменить функцию перенаправления (), и я вижу это сообщение «Пожалуйста, исправьте ошибку ниже»..