Django入门之用户管理(III)

本篇内容是利用Python语言,创建一个用户注册模块。
头图


Django入门之用户管理

用户注册
我们平时看到的用户注册页面都是由一个一个的表单构成的,所以编写表单文件account/forms.py,在其中创建一个表单类

    from django import forms
    from django.contrib.auth.models import User
    class RegistrationForm(forms.ModelForm):
        password = forms.CharField(label="Password",widget=forms.PasswordInput)
        password2 = forms.CharField(label="Confirm Password",widget=forms.PasswordInput)
        class Meta:  
            model = User
            fields = ("username","email")#1
        def clean_password2(self): #2
            cd = self.cleaned_data
            if cd['password']!=cd['password2']:
                raise forms.ValidationError("Passwords do not match.")
            return cd['password2']

这个表单继承的是ModelForm类,与之前的Form类有一些不同,如果要将表单中的数据写入数据表或修改某些记录的值,就继承ModelForm类;如果提交表单之后不需要对数据库进行修改,就继承Form类。
语句1 规定了写入数据库中的内容
语句2 保证了两次密码的一致性。以“clean+属性名称”的名字创建的方法都有检查的功能。
这里的数据模型是django中自己带有的,之后也会创建一些django中没有的属性。

编辑视图函数account/view.py文件,

    from .forms import LoginForm,RegistrationForm
    def register(request):
        if request.method =="POST":
            user_form = RegistrationForm(request.POST)
            if user_form.is_valid():
                new_user = user_form.save(commit=False)
                new_user.set_password(user_form.cleaned_data['password'])
                new_user.save()
            return HttpResponse("successfully")
        else:
            return HttpResponse("sorry,your can not register.")
        else:
            user_form = RegistrationForm()
            return render(request,"account/register.html",{"form":user_form)

这个视图函数保证了只有当两次密码输入均相同时才写入到数据库,用ModelForm自带的save()方法

接下来将注册页面写好,写在templates/account/register.html中,并配置好url

    from django.conf.urls import url
    from . import views
    ...
    url(r'^register/$', views.register, name='user_register'),

检查django服务是否运行,打开浏览器,可以运行了。
增加注册内容
本次添加django中内置没有的属性。那就需要自己创建,还记得博客属性的创建过程么,过程非常类似,首先在account/models.py文件中创建新添加的属性

    from __future__ import unicode_literals
    from django.contrib.auth.models import User
    from django.db import models
    class UserProfile(models.Model):#1
        user = models.OneToOneField(User, unique=True)#2
        birth = models.DateField(blank=True, null=True)
        phone = models.CharField(max_length=20,null=True)
        def __uncode__(self):
            return 'user{}'.format(self.user.nsername)

1.定义了数据模型类对应在数据库中的名称account_userprofile
2.定义的user的唯一性

然后进行数据迁移
python manage.py makemigrations account
python manage.py migrate account
再将这些属性在表单类forms.py中创建

    class UserProfileForm(forms.ModelForm):
        class Meta:
            model = UserProfile
            fields = ("phone","birth")

编辑视图函数

    from django.shortcuts import render
    from django.http import HttpResponse
    from django.contrib.auth import authenticate,login
    from .forms import LoginForm,RegistrationForm,UserProfileForm

        if request.method =="POST":
            user_form = RegistrationForm(request.POST)
            userprofile_form = UserProfileForm(request.POST)
            if user_form.is_valid()*userprofile_form.is_valid():
                new_user = user_form.save(commit=False)
                new_user.set_password(user_form.cleaned_data['password'])
                new_user.save()
                new_profile = userprofile_form.save(commit=False)
                new_profile.user = new_user
                new_profile.save()
                return HttpResponse("successfully")
            else:
                return HttpResponse("sorry,your can not register.")
        else:
            user_form = RegistrationForm()
            userprofile_form = UserProfileForm()
            return render(request,"account/register.html",{"form":user_form,"profile":userprofile_form})

在原有的视图函数上修改,增加注册表的属性。并将视图页面重新编写好。就可以重新运行了

猜你喜欢

转载自blog.csdn.net/sinat_38885850/article/details/82155516