【问题标题】:Django Validation error not showing on form表单上未显示 Django 验证错误
【发布时间】:2019-07-16 09:23:34
【问题描述】:

我想检查用户注册。

如果用户名已经注册,给用户一个验证错误。

在我的终端环境中,data_user 字典也打印出来了 但在我的表单注册中,用户名验证错误不适用于 help.html 这是同一个表格。 ---> https://imgur.com/a/osAv0xn

models.py

​​>
from django.db import models

class SignUpModel(models.Model):
    name = models.CharField(max_length=20,null=True)
    family = models.CharField(max_length=30,null=True)
    username = models.CharField(max_length=10)
    email = models.EmailField(null=True,unique=True)
    password = models.CharField(max_length=20,null=True)

# Create your models here.
class LoginModel(models.Model):
    username = models.CharField(max_length=15)
    password = models.CharField(max_length=20)

views.py

​​>
from django.shortcuts import render
from .forms import *
from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required()
def blogPostSignUpView(request):

    form = BlogPostSignUpModelForm(request.POST or None)
    if form.is_valid():
        form.save()
        print(form.cleaned_data)
        form = BlogPostSignUpModelForm()
    template_name = "help.html"
    context = {"title":"register","form":form}
    return render(request,template_name,context)
@staff_member_required
def blogPostLoginView(request):
    form = BlogPostLoginModelForm(request.POST or None)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.save()
        
    template_name = 'help.html'
    context = {"title":"login","form":form}
    return render(request,template_name , context)

forms.py

​​>
from django import forms
from .models import SignUpModel,LoginModel

#Sign UP Form
class BlogPostSignUpForm(forms.Form):
    name = forms.CharField()
    family = forms.CharField()
    username = forms.CharField()
    email = forms.CharField(widget=forms.EmailField)
    password = forms.CharField()

class BlogPostSignUpModelForm(forms.ModelForm):
    class Meta:
        model = SignUpModel
        fields = ['name','family','username','email' , 'password']
    def check_password(self, *args, **kwargs):
        uname = self.cleaned_data.get('username')
        data_user = SignUpModel.objects.filter(username=uname)
        print(data_user)
        if data_user:
            if uname == data_user['username']:
                raise forms.ValidationError("This user has exist !!!")
        return uname


#Login Form
class BlogPostLoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()

class BlogPostLoginModelForm(forms.ModelForm):
    class Meta:
        model = LoginModel
        fields = ['username','password']

urls.py

​​>
from django.urls import path
from .views import (
blogPostSignUpView,
blogPostLoginView
)
urlpatterns = [
    path('signup/',blogPostSignUpView),
    path('login/',blogPostLoginView),
    ]

help.html

{% extends "base.html" %}
{% block username%}
{{request.user}}
{% endblock %}

{% block form %}
    <div class="container" >

       <div class="row">
        <div class="col-md-5 mx-auto">
         <div id="first">
                      <div class="myform form ">
               <div class="logo mb-3">
                    <div class="col-md-12 text-center">
                     <h1>register</h1>
                </div>
                </div>
                            <form action="" method="post" name="login" > {% csrf_token %}
                                  <div class="form_django">
                       {{ form.as_p }}
                   </div>

                                   <button type="submit">Send</button>
                              </form>
                 </div>
            </div>
               </div>
     </div>
     </div>

{% endblock %}

我错过了什么?

【问题讨论】:

  • 你在同一个变量中实例化空表单,从你的views.py中删除这一行form = BlogPostSignUpModelForm()
  • 你不能这样做。使用 Django 的内置身份验证。
  • 这不是我找到答案的原因,下面我贴出来。谢谢@NalinDobhal,

标签: django python-3.x validation django-forms django-views


【解决方案1】:

在 Django 表单和字段验证中,clean_&lt;fieldname&gt;() 方法在表单子类上被调用——其中替换为表单字段属性的名称,所以

我们不应该在BlogPostSignUpModelForm 类中使用任何喜欢的方法名称。

替换后,项目工作:)

因此,代码应相应更改。

更改 forms.py

​​>
from django import forms
from .models import SignUpModel,LoginModel

#Sign UP Form
class BlogPostSignUpForm(forms.Form):
    name = forms.CharField()
    family = forms.CharField()
    username = forms.CharField()
    email = forms.CharField(widget=forms.EmailField)
    password = forms.CharField()

class BlogPostSignUpModelForm(forms.ModelForm):
    class Meta:
        model = SignUpModel
        fields = ['name','family','username','email' , 'password']
    def clean_username(self, *args, **kwargs):
        uname = self.cleaned_data.get('username')
        data_user = SignUpModel.objects.filter(username=uname)
        print(data_user)
        if data_user:
            raise forms.ValidationError("username or email has been exist !!!")
        return uname

#Login Form
class BlogPostLoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField()

class BlogPostLoginModelForm(forms.ModelForm):
    class Meta:
        model = LoginModel
        fields = ['username','password']

【讨论】:

    猜你喜欢
    • 2012-04-05
    • 2021-01-01
    • 1970-01-01
    • 2018-04-19
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2019-01-30
    相关资源
    最近更新 更多