简体   繁体   English

Django-自定义注册表单(错误,唯一的电子邮件和管理员)

[英]Django - custom registration form (errors, unique email and admin)

first of all, I am new in programming with Django. 首先,我是Django编程的新手。 Here is what I have: 这是我所拥有的:

The <form> inside my register.html template: 我的register.html模板中的<form>

<form method='POST' action='/accounts/register/'>
   {% csrf_token %}
   {% for field in form %}
       {{ field.label_tag }}{{ field }} {{field.help_text}} {{field.errors}{}
   <br/>
   {% endfor %}
   <input type='submit' value='Register' />
</form>

This is inside my forms.py 这是在我的forms.py里面

class MyRegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
first_name = forms.CharField(required = True)
last_name = forms.CharField(required = True)
password1 = forms.RegexField(widget=forms.PasswordInput,
                            regex = r'[\w+]{8,}',
                            label = 'New password',
                            help_text = "Must be strong!",
                            error_messages = {'required' : "ASDASDA",
                                              'invalid' : "ZZZZZ"}
                            )
password2 = forms.RegexField(widget=forms.PasswordInput,
                            regex = r'[\w+]{8,}',
                            label = 'Re-enter password',
                            )

class Meta:
    model = User
    fields = ('last_name', 'first_name', 'username', 'email', 'password1', 'password2')

def save(self, commit = True):
    user = super(MyRegistrationForm, self).save(commit = False)
    user.email = self.cleaned_data['email']
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']

    if commit:
        user.save()

    return user

This is inside my views.py 这是我的views.py

def User_Register_View(request):
if request.method == 'POST':
    form = MyRegistrationForm(request.POST)
    if form.is_valid():
        form.save()
        register_success = "Account successfuly created!"
        return render(request,'index.html', locals())

args = {}
args.update(csrf(request))
args['form'] = MyRegistrationForm()

return render(request,'accounts/register.html',args)

My questions are the following: 我的问题如下:

  1. {{field.errors}} is not working. {{field.errors}}无法正常工作。 No errors are printed. 没有错误打印。 If I let all the fields of the form empty, and I click 'Register', no error is rendered. 如果我将表单的所有字段留空,然后单击“注册”,则不会出现任何错误。

  2. If I add another field to this forum, "gender" as a CharField, will it create a column inside my DB for gender? 如果我向该论坛添加另一个字段“ gender”作为CharField,它将在我的数据库中为性别创建一列吗? ( I am working with the default sqlite3) (我正在使用默认的sqlite3)

  3. Is there a simple way to modify my code and make the 'User' field optional and, instead, make the 'Email' field be unique and required? 有没有一种简单的方法来修改我的代码并使“用户”字段为可选,而是使“电子邮件”字段唯一且必填?

  4. In the state in which my code is, where can I check for the unique property of my email in the DB? 在我的代码所在的状态下,我可以在哪里检查数据库中电子邮件的唯一属性? Is it inside my views.py, just before form.save() ? 它在form.save()之前的views.py中吗?

Thank you. 谢谢。 Let me know if you have any questions 如果您有任何疑问,请告诉我

def User_Register_View(request):

    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
          form.save()
          register_success = "Account successfuly created!"
          return render(request,'index.html', locals())
    else:
        form = MyRegistrationForm() # An unbound form

    args = {}
    args['form'] = form

    return render(request,'accounts/register.html',args)
  1. {{field.errors}} now showing because you are not returning the validated form instance if validation failed. 现在显示{{field.errors}},因为如果验证失败,您不会返回经过验证的表单实例。 You always return a new instance of MyRegistrationForm. 您总是返回MyRegistrationForm的新实例。 See above example. 参见上面的例子。

  2. adding fields to forms will not affect your db since only models maps to db tables 向表单添加字段不会影响您的数据库,因为只有模型映射到数据库表

  3. & 4. You need custom user model to do so, see here for example on how to do it &4.您需要自定义用户模型,请参见此处的示例

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM