鱼C论坛

 找回密码
 立即注册
查看: 2216|回复: 2

[已解决]Django form 添加错误提示问题。

[复制链接]
发表于 2023-4-13 17:39:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. class CustomLoginView(LoginView):
  2.     form_class = LoginForm
  3.     def form_valid(self,form):
  4.         remember_me = form.cleaned_data.get('remember_me')
  5.         username = form.cleaned_data.get('username')
  6.         capt=form.cleaned_data.get("captcha")
  7.         key=form.cleaned_data.get("hashkey")
  8.         jc=jarge_captcha(capt,key)
  9.         print("form_valid",jc)
  10.         if not remember_me:
  11.             self.request.session.set_expiry(0)
  12.             self.request.session.modified = True
  13.         
  14.         if jarge_captcha(capt,key)==True:
  15.             print("form_valid True",jc)
  16.             return super(CustomLoginView, self).form_valid(form)
  17.            
  18.         else:
  19.             print("form_valid ValidationError",jc)
  20.             #form.add_error('captcha',ValidationError('验证码错误'))
  21.             return HttpResponse(f'{username} 验证码错误')
复制代码




20230413173832.png


怎么让验证码错误提示在form上呢? 现在用HttpResponse 是打开了另一窗口提示的。。。
最佳答案
2023-4-13 17:44:21
要将验证码错误提示显示在表单上,您可以将错误添加到表单实例中,然后重新呈现表单。您可以通过以下方法实现这一目标:

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

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

这是修改后的代码:

  1. from django.contrib import messages

  2. class CustomLoginView(LoginView):
  3.     form_class = LoginForm

  4.     def form_valid(self, form):
  5.         remember_me = form.cleaned_data.get('remember_me')
  6.         username = form.cleaned_data.get('username')
  7.         capt = form.cleaned_data.get("captcha")
  8.         key = form.cleaned_data.get("hashkey")
  9.         jc = jarge_captcha(capt, key)
  10.         print("form_valid", jc)
  11.         
  12.         if not remember_me:
  13.             self.request.session.set_expiry(0)
  14.             self.request.session.modified = True

  15.         if jarge_captcha(capt, key) == True:
  16.             print("form_valid True", jc)
  17.             return super(CustomLoginView, self).form_valid(form)
  18.         else:
  19.             print("form_valid ValidationError", jc)
  20.             form.add_error('captcha', '验证码错误')
  21.             return self.form_invalid(form)
复制代码


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

  1. {% for field in form %}
  2.     <div class="form-group">
  3.         <label for="{{ field.id_for_label }}">{{ field.label }}</label>
  4.         {{ field }}
  5.         {% if field.errors %}
  6.             <div class="text-danger">
  7.                 {% for error in field.errors %}
  8.                     {{ error }}
  9.                 {% endfor %}
  10.             </div>
  11.         {% endif %}
  12.     </div>
  13. {% endfor %}
复制代码


这段代码会迭代表单中的所有字段,并在每个字段后面显示其错误信息。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-13 17:40:29 | 显示全部楼层
本帖最后由 sfqxx 于 2023-4-13 17:44 编辑

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

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

所以您的代码将变成:

  1. from django.shortcuts import render

  2. class CustomLoginView(LoginView):
  3.     form_class = LoginForm
  4.    
  5.     def form_valid(self,form):
  6.         remember_me = form.cleaned_data.get('remember_me')
  7.         username = form.cleaned_data.get('username')
  8.         capt=form.cleaned_data.get("captcha")
  9.         key=form.cleaned_data.get("hashkey")
  10.         jc=jarge_captcha(capt,key)
  11.         print("form_valid",jc)
  12.         
  13.         if not remember_me:
  14.             self.request.session.set_expiry(0)
  15.             self.request.session.modified = True
  16.         
  17.         if jarge_captcha(capt,key)==True:
  18.             print("form_valid True",jc)
  19.             return super(CustomLoginView, self).form_valid(form)
  20.            
  21.         else:
  22.             print("form_valid ValidationError",jc)
  23.             form.add_error('captcha', '验证码错误')
  24.             #return HttpResponse(f'{username} 验证码错误')
  25.             return render(self.request, 'your_template_name.html', {'form': form})
复制代码


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


  1. {% if form.errors %}
  2.     <div class="alert alert-danger">
  3.         {% for field_errors in form.errors.values %}
  4.             {% for error in field_errors %}
  5.                 <strong>{{ error }}</strong>
  6.             {% endfor %}
  7.         {% endfor %}
  8.     </div>
  9. {% endif %}
复制代码


在这个模板中,您可以使用Bootstrap类添加样式。
有用请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-13 17:44:21 | 显示全部楼层    本楼为最佳答案   
要将验证码错误提示显示在表单上,您可以将错误添加到表单实例中,然后重新呈现表单。您可以通过以下方法实现这一目标:

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

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

这是修改后的代码:

  1. from django.contrib import messages

  2. class CustomLoginView(LoginView):
  3.     form_class = LoginForm

  4.     def form_valid(self, form):
  5.         remember_me = form.cleaned_data.get('remember_me')
  6.         username = form.cleaned_data.get('username')
  7.         capt = form.cleaned_data.get("captcha")
  8.         key = form.cleaned_data.get("hashkey")
  9.         jc = jarge_captcha(capt, key)
  10.         print("form_valid", jc)
  11.         
  12.         if not remember_me:
  13.             self.request.session.set_expiry(0)
  14.             self.request.session.modified = True

  15.         if jarge_captcha(capt, key) == True:
  16.             print("form_valid True", jc)
  17.             return super(CustomLoginView, self).form_valid(form)
  18.         else:
  19.             print("form_valid ValidationError", jc)
  20.             form.add_error('captcha', '验证码错误')
  21.             return self.form_invalid(form)
复制代码


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

  1. {% for field in form %}
  2.     <div class="form-group">
  3.         <label for="{{ field.id_for_label }}">{{ field.label }}</label>
  4.         {{ field }}
  5.         {% if field.errors %}
  6.             <div class="text-danger">
  7.                 {% for error in field.errors %}
  8.                     {{ error }}
  9.                 {% endfor %}
  10.             </div>
  11.         {% endif %}
  12.     </div>
  13. {% endfor %}
复制代码


这段代码会迭代表单中的所有字段,并在每个字段后面显示其错误信息。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 02:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表