【发布时间】: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