Django搭建博客_7:用户注册

1 注册表单类

  • 用户注册和实现登录类似,首先需要填写表单。
    编辑./account/forms.py,增加一个注册用户的表单类,并建立User的数据模型。
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")

def clean_password2(self):
	cd = self.cleaned_data
	if cd["password"] !=  cd["password2"]:
		raise forms.ValidationError("passwords do not match.")
	return cd["password2"]

语句①引入了Django默认的用户类型User类。

语句②传递的参数为forms.ModelForm,而登录函数用的传参是forms.Form,两者的区别是:如果要将表单中的数据写入数据库或者修改某些记录的值,就要使用ModelForm;图个提交表单之后,不会对数据库进行修改,则使用Form。

  • 编写注册的视图函数。
    编辑./account/views/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, You can't register.")
	else:
		user_form = RegistrationForm()
		return render(request, "account/register.html",  {"form": user_form})
  • 然后编写模板。
    在./templates/account里面创建register.html文件,代码如下:
{% extends "base.html" %}
{% load staticfiles %}
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Register</h1>
    <p>If you are a user, <strong><a href="{% url 'account:user_login' %}">Login</a></strong>,please</p>
    <p>or register.</p>
    <form class="form-horizontal" action="." method="post">{% csrf_token %}
        <div class="form-group">
            <label for="{{ form.username.id_for_label }}" class="col-md-5 control-label">Username</label>
            <div class="col-md-6 text-left">{{ form.username }}</div>
        </div>
<div class="form-group">
            <label for="{{ form.email.id_for_label }}" class="col-md-5 control-label">Email</label>
            <div class="col-md-6 text-left">{{ form.email }}</div>
        </div>

        <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Password</label>
            <div class="col-md-6 text-left">{{ form.password }}</div>
        </div>
        <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Confirm Password</label>
            <div class="col-md-6 text-left">{{ form.password2 }}</div>
        </div>
        <input type="submit" class="btn btn-primary btn-lg" value="REGISTER">
    </form>
</div>
{% endblock %}
  • 最后配置url。
    在./account/urls.py中配置。
url(r'^register/$', views.register, name='user_register'),  

浏览器访问http://127.0.0.1:8000/account/register/即可查看注册页面。
在这里插入图片描述

2 增加注册内容

第一节中的额注册过程,填写用户名,邮箱,密码等,在默认的User数据模型中还有用户名字等,但要增加一个User数据模型中没有的字段,需要如下操作。

  • 建立数据模型,以存储数据。
    编辑./account/models.py文件
from django.db import models
from django.contrib.auth.models import User

class UserProfile(models.Model):
	user = models.OneToOneField(User, unique=True)
	birth = models.DateField(blank=True, null=True)
	phone = models.CharField(max_length=20, null=True)

	def __str__(self):
		return 'user {}'.format(self.user.username)

依次执行:

develope/DjangoDemo/mysite
~ python  manage.py makemigrations account
Migrations for 'account':
  account/migrations/0001_initial.py
    - Create model UserProfile

~ python manage.py migrate account
Operations to perform:
  Apply all migrations: account
Running migrations:
  Applying account.0001_initial... OK

执行完成后,本地生成新的数据库account_userprofile。
在这里插入图片描述

  • 编辑表单类,用以网页提交数据。
    编辑./account/forms.py
from django import forms
from django.contrib.auth.models import User
from .models import UserProfile

...

class UserProfileForm(forms.ModelForm):
	class Meta:
		model = UserProfile
		fields = ("phone", "birth")
  • 完善视图类,
    编辑./account/view.py文件。
...
from . forms import LoginForm, RegistrationForm, UserProfileForm

...

def register(request):
	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, You can't register.")
	else:
		user_form = RegistrationForm()
		userprofile_form = UserProfileForm()
		return render(request, "account/register.html",  {"form": user_form, "profile":userprofile_form})
  • 完善模板
    编辑 ./templates/account/register.html文件
{% extends "base.html" %}
{% block title %}register user{% endblock %}
{% block content %}
<div class="row text-center vertical-middle-sm">
    <h1>Register</h1>
    <p>If you are a user, <strong><a href="{% url 'account:user_login' %}">Login</a></strong>,please</p>
    <p>or register.</p>
    <form class="form-horizontal" action="." method="post">{% csrf_token %}
        <div class="form-group">
            <label for="{{ form.username.id_for_label }}" class="col-md-5 control-label">Username</label>
            <div class="col-md-6 text-left">{{ form.username }}</div>
        </div>
        <div class="form-group">
            <label for="{{ form.email.id_for_label }}" class="col-md-5 control-label">Email</label>
            <div class="col-md-6 text-left">{{ form.email }}</div>
        </div>
        <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Password</label>
            <div class="col-md-6 text-left">{{ form.password }}</div>
        </div>
        <div class="form-group">
            <label for="{{ form.password.id_for_label }}" class="col-md-5 control-label">Confirm Password</label>
            <div class="col-md-6 text-left">{{ form.password2 }}</div>
        </div>
        <div class="form-group">
            <label for="{{ profile.birth.id_for_label }}" class="col-md-5 control-label">Birth Date</label>
            <div class="col-md-6 text-left">{{ profile.birth }}</div>
        </div>
        <div class="form-group">
            <label for="{{ profile.phone.id_for_label }}" class="col-md-5 control-label">Phone</label>
            <div class="col-md-6 text-left">{{ profile.phone }}</div>
        </div>
        <input type="submit" class="btn btn-primary btn-lg" value="REGISTER">
    </form>
</div>
{% endblock %}

打开注册界面
在这里插入图片描述
正常注册后:
在这里插入图片描述
数据入库:
在这里插入图片描述

3 管理新增的注册内容

在超级管理员界面进行集中管理注册信息。

  • 编辑./account/admin.py文件进行编辑
from django.contrib import admin
from .models import UserProfile

class UserProfileAdmin(admin.ModelAdmin):
	list_display = ('user', 'birth', 'phone')
	list_filter = ('phone', )

admin.site.register(UserProfile, UserProfileAdmin)

list_display属性的作用是列出列表中的项目。
list_filter的作用是规定网页右边FILTER显示的内容。

访问http://127.0.0.1:8000/admin/进入管理后台
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tt75281920/article/details/105756284