显示 django 注册表单错误

我想在用户尝试注册时显示注册错误,但他做了一些错误的事情,例如输入现有电子邮件地址或两个密码不匹配,或者不考虑 django 的默认密码验证器之一(例如输入短密码),并能够使用引导警报设置每个错误的样式,如我在下面的模板中所示


models.py 中的用户模型


from django.db import models

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

from django.conf import settings


class User(AbstractBaseUser):

    email = models.EmailField(verbose_name="Email",max_length=250, unique=True)

    username = models.CharField(max_length=30, unique=True, null=True)

    date_joined = models.DateTimeField(verbose_name='Date joined', auto_now_add=True)

    last_login = models.DateTimeField(verbose_name='Last login', auto_now=True)

    is_admin = models.BooleanField(default=False)

    is_active = models.BooleanField(default=True)

    is_staff = models.BooleanField(default=False)

    is_superuser = models.BooleanField(default=False)

    full_name = models.CharField(verbose_name="Full name", max_length=150, null=True)

    profile_pic = models.ImageField(null=True, blank=True)


    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = ['full_name']


    objects = MyAccountManager()


    def __str__(self):

        return self.full_name


    # For checking permissions.

    def has_perm(self, perm, obj=None):

        return self.is_admin


    # For which users are able to view the app (everyone is)

    def has_module_perms(self, app_label):

        return True


精慕HU
浏览 106回答 1
1回答

繁花如伊

一旦调用form.is_valid()表单的实例,是否存在错误就变得非常重要,因为这些错误存在于该实例上。因此,您需要将其传递回用户才能显示错误。我的意思的一个简单例子是:&nbsp; &nbsp; def register(request):&nbsp; &nbsp; &nbsp; &nbsp; form = CustomUserCreationForm()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if request.method == "POST":&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; form = CustomUserCreationForm(request.POST)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if form.is_valid():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user = form.save(commit=False)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user.is_valid = False&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user.save()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Maybe redirect here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messages.info(request, 'invalid registration details')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return render(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; request, "users/register.html",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {"form": form}&nbsp; &nbsp; &nbsp; &nbsp; )这样,您就可以迭代模板中的错误。&nbsp; &nbsp; <form method="post" action="">&nbsp; &nbsp; &nbsp; &nbsp; {% csrf_token %}&nbsp; &nbsp; &nbsp; &nbsp; {% if form.non_field_errors %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {% for error in form.non_field_errors %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{ error }}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {% endfor %}&nbsp; &nbsp; &nbsp; &nbsp; {% endif %}&nbsp; &nbsp; &nbsp; &nbsp; {% for hidden in form.hidden_fields %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{ hidden }}&nbsp; &nbsp; &nbsp; &nbsp; {% endfor %}&nbsp; &nbsp; &nbsp; &nbsp; {% for field in form %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{ field }}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {{ field.errors.as_ul }}&nbsp; &nbsp; &nbsp; &nbsp; {% endfor %}&nbsp; &nbsp; &nbsp; &nbsp; <button class="btn btn-primary" type="submit">Submit</button>&nbsp; &nbsp; </form>像这样的更通用的模板也会对您有所帮助,因为您可以将其重用于任何表单,而不是像示例中那样指定特定的表单和字段名称。我要指出的另一件事是,您认为存在很多复杂性,例如对请求方法的大量检查。还有3种不同的形式。如果页面中有不同的表单,您可以命名提交按钮,以便您可以检查正在提交哪个表单。我在这里有一个答案来展示如何处理多种表单。您这样做时user.email没有检查用户是否经过身份验证或检查电子邮件是否存在,因此那里也会发生错误。因此,为了简化您的视图,您可以执行类似的操作(在命名表单按钮之后);def home(request):&nbsp; &nbsp; user = request.user&nbsp; &nbsp; # for rendering texts&nbsp; &nbsp; text_form = TextForm()&nbsp; &nbsp; signin_form = SigninForm()&nbsp; &nbsp; signup_form = SignupForm()&nbsp; &nbsp; if request.method == "POST":&nbsp; &nbsp; &nbsp; &nbsp; if 'text_form' in request.POST:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text_form = TextForm(request.POST)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if text_form.is_valid() and request.user.is_authenticated:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj = text_form.save(commit=False)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; author = User.objects.filter(email=user.email).first()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; obj.author = author&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; text_form.save()&nbsp; &nbsp; &nbsp; &nbsp; if 'signin_form' in request.POST:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; signin_form = SigninForm(request.POST)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if signin_form.is_valid():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; email = request.POST['email']&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; password = request.POST['password']&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; user = authenticate(email=email, password=password)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if user:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; login(request, user)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elif user is None:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; messages.error(request, 'ُEmail or password is incorrect')&nbsp; &nbsp; &nbsp; &nbsp; if 'signup_form' in request.POST:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; signup_form = SignupForm(request.POST)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if signup_form.is_valid():&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; User = signup_form.save()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; full_name = signup_form.cleaned_data.get('full_name')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; email = signup_form.cleaned_data.get('email')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raw_password = signup_form.cleaned_data.get('password1')&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; account = authenticate(email=email, password=raw_password)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; login(request, account)&nbsp; &nbsp; texts = Text.objects.all().order_by('-id')&nbsp; &nbsp; context = {&nbsp; &nbsp; &nbsp; &nbsp; 'signin_form': signin_form,&nbsp; &nbsp; &nbsp; &nbsp; 'signup_form': signup_form,&nbsp; &nbsp; &nbsp; &nbsp; 'text_form': text_form,&nbsp; &nbsp; &nbsp; &nbsp; 'texts': texts&nbsp; &nbsp; }&nbsp; &nbsp; return render(request, 'main/home.html', context)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python