为了账号安全,请及时绑定邮箱和手机立即绑定

显示 django 注册表单错误

显示 django 注册表单错误

精慕HU 2023-09-05 20:17:41
我想在用户尝试注册时显示注册错误,但他做了一些错误的事情,例如输入现有电子邮件地址或两个密码不匹配,或者不考虑 django 的默认密码验证器之一(例如输入短密码),并能够使用引导警报设置每个错误的样式,如我在下面的模板中所示models.py 中的用户模型from django.db import modelsfrom django.contrib.auth.models import AbstractBaseUser, BaseUserManagerfrom django.conf import settingsclass 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
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

一旦调用form.is_valid()表单的实例,是否存在错误就变得非常重要,因为这些错误存在于该实例上。因此,您需要将其传递回用户才能显示错误。


我的意思的一个简单例子是:


    def register(request):

        form = CustomUserCreationForm()

            

        if request.method == "POST":

    

            form = CustomUserCreationForm(request.POST)

    

            if form.is_valid():

                user = form.save(commit=False)

    

                user.is_valid = False

                user.save()

                # Maybe redirect here

            else:

                messages.info(request, 'invalid registration details')

                

        return render(

            request, "users/register.html",

            {"form": form}

        )


这样,您就可以迭代模板中的错误。



    <form method="post" action="">

        {% csrf_token %}


        {% if form.non_field_errors %}

            {% for error in form.non_field_errors %}

                {{ error }}

            {% endfor %}

        {% endif %}


        {% for hidden in form.hidden_fields %}

            {{ hidden }}

        {% endfor %}


        {% for field in form %}

            {{ field }}

            {{ field.errors.as_ul }}

        {% endfor %}


        <button class="btn btn-primary" type="submit">Submit</button>

    </form>

像这样的更通用的模板也会对您有所帮助,因为您可以将其重用于任何表单,而不是像示例中那样指定特定的表单和字段名称。


我要指出的另一件事是,您认为存在很多复杂性,例如对请求方法的大量检查。还有3种不同的形式。如果页面中有不同的表单,您可以命名提交按钮,以便您可以检查正在提交哪个表单。我在这里有一个答案来展示如何处理多种表单。


您这样做时user.email没有检查用户是否经过身份验证或检查电子邮件是否存在,因此那里也会发生错误。


因此,为了简化您的视图,您可以执行类似的操作(在命名表单按钮之后);



def home(request):

    user = request.user


    # for rendering texts

    text_form = TextForm()

    signin_form = SigninForm()

    signup_form = SignupForm()


    if request.method == "POST":

        if 'text_form' in request.POST:

            text_form = TextForm(request.POST)

            if text_form.is_valid() and request.user.is_authenticated:

                obj = text_form.save(commit=False)

                author = User.objects.filter(email=user.email).first()

                obj.author = author

                text_form.save()


        if 'signin_form' in request.POST:

            signin_form = SigninForm(request.POST)

            if signin_form.is_valid():

                email = request.POST['email']

                password = request.POST['password']

                user = authenticate(email=email, password=password)

                if user:

                    login(request, user)

                elif user is None:

                    messages.error(request, 'ُEmail or password is incorrect')


        if 'signup_form' in request.POST:

            signup_form = SignupForm(request.POST)

            if signup_form.is_valid():

                User = signup_form.save()

                full_name = signup_form.cleaned_data.get('full_name')

                email = signup_form.cleaned_data.get('email')

                raw_password = signup_form.cleaned_data.get('password1')

                account = authenticate(email=email, password=raw_password)

                login(request, account)


    texts = Text.objects.all().order_by('-id')


    context = {

        'signin_form': signin_form,

        'signup_form': signup_form,

        'text_form': text_form,

        'texts': texts

    }


    return render(request, 'main/home.html', context)


查看完整回答
反对 回复 2023-09-05
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信