模板不显示验证错误(Django)

Posted

技术标签:

【中文标题】模板不显示验证错误(Django)【英文标题】:Template not displaying Validation error (Django) 【发布时间】:2021-08-26 14:52:27 【问题描述】:

我正在尝试在我的模板 (register.html) 中显示 验证错误,但它没有显示。这段代码有什么问题?

还有一个问题“我如何显示电子邮件已经存在于这种表单中”

我不知道如何显示“电子邮件已存在”。

代码在这里。

forms.py

from django.contrib.auth.models import User
from django import forms
from .models import *
from django.utils.translation import gettext as _


class RegisterForm(forms.ModelForm):
    username = forms.CharField(widget=forms.TextInput())
    password = forms.CharField(widget=forms.PasswordInput())
    email = forms.CharField(widget=forms.EmailInput())

    class Meta:
        model = Customer
        fields =["full_name", "username", "email", "password"]

    def clean_username(self):
        uname = self.cleaned_data.get('username')
        if User.objects.filter(username = uname).exists():
            raise forms.ValidationError(_('Customer with this username already exists'), code='invalid')

        return uname

    def __init__(self, *args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor
        self.fields['username'].widget.attrs['style'] = 'width:500px; height:40px;'
        self.fields['password'].widget.attrs['style']  = 'width:500px; height:40px;'
        self.fields['email'].widget.attrs['style']  = 'width:500px; height:40px;'
        self.fields['full_name'].widget.attrs['style']  = 'width:500px; height:40px;'

我无法在上述代码Customer with this username already exists上显示错误消息

views.py

from django.shortcuts import render, redirect
from django.views.generic import CreateView, View, FormView
from django.contrib.auth import authenticate, login, logout
from django.urls import reverse_lazy
from .forms import *
# Create your views here.
class customerRegister(CreateView):
    template_name = "register.html"
    form_class = RegisterForm
    success_url = reverse_lazy("main_app:base")
    def form_valid(self, form):
        username = form.cleaned_data.get("username")
        email = form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")     
        user = User.objects.create_user(username, email, password)
        form.instance.user = user
        login(self.request, user)
        return super().form_valid(form)
    def get_success_url(self):
        if "next" in self.request.GET:
            next_url = self.request.GET.get("next")
            return next_url
        else:
            return self.success_url
    

register.html

<body style="background-color: #95a5a6">
  % if error %
  <div class="alert alert-dismissible alert-danger">
    <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    <strong>Oh snap!</strong>form.non_field_errors
  </div>
  % endif %
  <div class="container-register mx-auto">
    <form action="% url 'account:register' %" method="post">
      % csrf_token %
      <fieldset>
        <h2 class="text-center" style="margin-top: 50px">Register</h2>
        <div class="form-group">
          <label class="col-form-label mt-4" for="inputDefault">Full Name*</label><br>
          form.full_name<br>
        </div>
        <div class="form-group">
          <label class="col-form-label mt-4" for="inputDefault">Username*</label><br>
          form.username<br>
        </div>
        <div class="form-group">
          <label for="exampleInputEmail1" class="form-label mt-4 ">Email address*</label><br>
          form.email<br>
          <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
        </div>
        <div class="form-group">
          <label for="exampleInputPassword1" class="form-label mt-4">Password*</label><br>
          form.password<br>
        </div>
        <br/>
        <div class="text-center">
        <button type="submit" class="btn btn-lg btn-primary">Register</button>
        </div>
      </fieldset>
  </form>
    <hr>  
    <h5 class="text-center" style="margin-top: 50px">Already Registered?<a class="nav-link" href="% url 'account:login'%">Log in</a></h5>
  </div>
</body>

【问题讨论】:

这能回答你的问题吗? Django Forms: if not valid, show form with error message 也可以看看文档:docs.djangoproject.com/en/3.2/topics/forms/… 您好,@AbdulAzizBarkat 确实,您看到我的问题并尝试分析问题或只是参考答案。我已经搜索了所有答案。并且您提到的问题对我没有帮助……并且在我的上述问题中还提出了一个问题。如何添加电子邮件验证。您只需关闭答案即可。 我已阅读您的问题,该问题确实向您展示了如何呈现表单错误。下一个“在我的上述问题中也提出了一个问题”您应该在一篇帖子中提出多个问题,它应该是一个问题每个帖子。 您好@AbdulAzizBarkat,以上参考答案对我没有帮助。我尝试了所有的事情,但它就像转储不显示错误消息。上面这个问题还有一个问题是。“如何在同一代码中添加电子邮件验证代码” 你好@AbdulAzizBarkat 我将编辑代码,但你正在关闭答案不是解决方案 【参考方案1】:

在您的模板中,% if error % 不存在,因为您没有传递模板上下文 error。在模板if 中,您将访问form.non_field_errors,如果出现错误,该模板将存在。

所以应该是% if form.non_field_errors % 像这样:

  % if form.non_field_errors %
  <div class="alert alert-dismissible alert-danger">
    <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
    <strong>Oh snap!</strong>form.non_field_errors
  </div>
  % endif %

查看相关的 *** 帖子 here 以自定义电子邮件错误消息。

【讨论】:

以上是关于模板不显示验证错误(Django)的主要内容,如果未能解决你的问题,请参考以下文章

显示 ModelForms 的 django 表单验证错误

在自定义 Django 表单中验证和显示错误

Django 自定义 500 错误模板不显示 request.user

Django Allauth 自定义登录不显示错误

Django 表单:无法显示验证错误

Django模板不显示循环键、值