abababab 发表于 2023-4-13 17:39:54

Django form 添加错误提示问题。

class CustomLoginView(LoginView):
    form_class = LoginForm
    def form_valid(self,form):
      remember_me = form.cleaned_data.get('remember_me')
      username = form.cleaned_data.get('username')
      capt=form.cleaned_data.get("captcha")
      key=form.cleaned_data.get("hashkey")
      jc=jarge_captcha(capt,key)
      print("form_valid",jc)
      if not remember_me:
            self.request.session.set_expiry(0)
            self.request.session.modified = True
      
      if jarge_captcha(capt,key)==True:
            print("form_valid True",jc)
            return super(CustomLoginView, self).form_valid(form)
         
      else:
            print("form_valid ValidationError",jc)
            #form.add_error('captcha',ValidationError('验证码错误'))
            return HttpResponse(f'{username} 验证码错误')






怎么让验证码错误提示在form上呢? 现在用HttpResponse 是打开了另一窗口提示的。。。

sfqxx 发表于 2023-4-13 17:40:29

本帖最后由 sfqxx 于 2023-4-13 17:44 编辑

您可以使用在django中内置的模板标签 `{{ form.errors }}` 来显示表单错误信息。

首先,要让错误信息显示在表单上,需要更改HttpResponse返回到render。在这种情况下,您可以使用 `{'form': form}` 将表单传递给模板,以便在template中渲染它。

所以您的代码将变成:

from django.shortcuts import render

class CustomLoginView(LoginView):
    form_class = LoginForm
   
    def form_valid(self,form):
      remember_me = form.cleaned_data.get('remember_me')
      username = form.cleaned_data.get('username')
      capt=form.cleaned_data.get("captcha")
      key=form.cleaned_data.get("hashkey")
      jc=jarge_captcha(capt,key)
      print("form_valid",jc)
      
      if not remember_me:
            self.request.session.set_expiry(0)
            self.request.session.modified = True
      
      if jarge_captcha(capt,key)==True:
            print("form_valid True",jc)
            return super(CustomLoginView, self).form_valid(form)
         
      else:
            print("form_valid ValidationError",jc)
            form.add_error('captcha', '验证码错误')
            #return HttpResponse(f'{username} 验证码错误')
            return render(self.request, 'your_template_name.html', {'form': form})


然后在template中添加以下行,将错误信息显示在表单上:


{% if form.errors %}
    <div class="alert alert-danger">
      {% for field_errors in form.errors.values %}
            {% for error in field_errors %}
                <strong>{{ error }}</strong>
            {% endfor %}
      {% endfor %}
    </div>
{% endif %}


在这个模板中,您可以使用Bootstrap类添加样式。
有用请设置最佳答案

isdkz 发表于 2023-4-13 17:44:21

要将验证码错误提示显示在表单上,您可以将错误添加到表单实例中,然后重新呈现表单。您可以通过以下方法实现这一目标:

在form_valid方法中,如果验证码错误,请将错误添加到表单的captcha字段。

返回form_invalid方法以重新呈现表单,并显示错误信息。

这是修改后的代码:

from django.contrib import messages

class CustomLoginView(LoginView):
    form_class = LoginForm

    def form_valid(self, form):
      remember_me = form.cleaned_data.get('remember_me')
      username = form.cleaned_data.get('username')
      capt = form.cleaned_data.get("captcha")
      key = form.cleaned_data.get("hashkey")
      jc = jarge_captcha(capt, key)
      print("form_valid", jc)
      
      if not remember_me:
            self.request.session.set_expiry(0)
            self.request.session.modified = True

      if jarge_captcha(capt, key) == True:
            print("form_valid True", jc)
            return super(CustomLoginView, self).form_valid(form)
      else:
            print("form_valid ValidationError", jc)
            form.add_error('captcha', '验证码错误')
            return self.form_invalid(form)

现在,当验证码错误时,错误信息将显示在表单的captcha字段旁边。请注意,如果您的模板中已经有用于显示字段错误的代码,这种方法才会生效。例如,您的模板应该包含类似以下代码的部分:

{% for field in form %}
    <div class="form-group">
      <label for="{{ field.id_for_label }}">{{ field.label }}</label>
      {{ field }}
      {% if field.errors %}
            <div class="text-danger">
                {% for error in field.errors %}
                  {{ error }}
                {% endfor %}
            </div>
      {% endif %}
    </div>
{% endfor %}

这段代码会迭代表单中的所有字段,并在每个字段后面显示其错误信息。
页: [1]
查看完整版本: Django form 添加错误提示问题。