【问题标题】:Form errors not displaying with Django Crispy FormsDjango Crispy Forms 不显示表单错误
【发布时间】:2021-08-15 13:55:43
【问题描述】:

几周前我刚开始学习 Django 和 Python。在项目注册页面上工作,一切正常,除了表单错误没有显示在表单本身上而是重定向到调试错误页面,如下所示

ValidationError at /register/
['Username exists']
Request Method: POST
Request URL:    http://127.0.0.1:8000/register/
Django Version: 3.2.5
Exception Type: ValidationError
Exception Value:    
['Username exists']

在新的用户配置文件注册期间,我正在检查用于注册的用户名是否已经存在,如果存在,我想向用户显示用户名已经存在的错误。

请看我下面的代码:

forms.py

class RegistrationForm(forms.Form):
    first_name = forms.CharField(label='First Name')
    last_name = forms.CharField(label='Last Name')
    username = forms.CharField(label='Username')
    password = forms.CharField(
        label='Password', widget=forms.PasswordInput(), min_length=8)
    password_confirm = forms.CharField(
        label='Confirm Password', widget=forms.PasswordInput())
    email_address = forms.EmailField(label='Email')
    phone_number = PhoneNumberField(label='Phone Number')
    whatsapp_number = PhoneNumberField(label='WhatsApp Number', required=False)
    COUNTRY_CHOICES = [
        ('', 'Choose...'),
    ]
    country = forms.ChoiceField(label='Country', choices=COUNTRY_CHOICES)
    referral_id = forms.CharField(label='Referral ID', required=False)
    license_agreement = forms.BooleanField(
        label='I agree to all the Terms and Conditions')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_id = 'create-account-form'
        self.helper.form_action = 'register'
        self.helper.form_show_errors = True
        self.helper.layout = Layout(
            Row(
                Column('first_name'),
                Column('last_name'), css_class='g-2'
            ),
            Row(
                Column(
                    PrependedText('username', '@')
                ),
                Column('country'), css_class='g-2'
            ),
            Row(
                Column('password'),
                Column('password_confirm'),
                Column('referral_id'),
                css_class='g-2'
            ),
            Row(
                Column('phone_number'),
                Column('whatsapp_number'),
                Column('email_address'), css_class='g-2'
            ),
            Row('license_agreement'),
            Row(Submit('submit', 'Create Account'))
        )

    def check_username(self):
        data = self.cleaned_data['username']
        if User.objects.filter(username__iexact=data).exists():
            raise ValidationError('Username exists')
        return data

    def compare_passwords(self):
        password1 = self.cleaned_data['password']
        password2 = self.cleaned_data['password_confirm']
        if password2 != password1:
            raise ValidationError('Password does not match')
        return password1

views.py

def reg_form(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            username = form.check_username()
            password = form.compare_passwords()
            email = form.cleaned_data['email_address']
            user = User.objects.create_user(
                username=username, email=email, password=password)
            user.first_name = first_name
            user.last_name = last_name
            user.save()
            user_info = UserInfo()
            user_info.user = user
            user_info.linked_user = user.username
            user_info.phone_number = form.cleaned_data['phone_number']
            user_info.whatsapp_number = form.cleaned_data['whatsapp_number']
            user_info.country = form.cleaned_data['country']
            user_info.referral_id = form.cleaned_data['referral_id']
            user_info.save()
            login(request, user)
            return redirect(reverse('dashboard'), permanent=True)
    else:
        form = RegistrationForm()
    return render(request, 'office/reg_form_hx.html', {'form': form})

模板

{% extends './base.html' %}
{% block main %}
{% load crispy_forms_tags %}
{% crispy form %}
{% endblock main %}

【问题讨论】:

    标签: python django django-crispy-forms


    【解决方案1】:

    我想通了。

    我应该为特定字段实现表单 clean() 方法或 clean_fieldname() 方法。

    它应该是 clean_username() 而不是 forms.py 文件中的 check_username()。

    谢谢。

    【讨论】:

      猜你喜欢
      • 2015-01-07
      • 2019-07-14
      • 2015-10-22
      • 2015-06-06
      • 2021-10-24
      • 2017-02-02
      • 2021-01-08
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多