本文基於上一篇文章的基礎上進行修改Django中allauth的安裝與基本使用
在這個部分,將開發兩個功能,一個是用戶登錄後跳轉到profile的界面(accounts/profile),另一個是允許登錄用戶修改個人信息(accounts/profile/update)。
第一步先創建UserProfile應用,用於存放用戶的額外信息。
python manage.py startapp UserProfile
注冊完應用後要要記得做一下幾件事,一是在settings.py
的INSTALLED_APPS中將應用進行注冊,二是在項目的urls.py
中注冊url。
# settings.py
INSTALLED_APPS = [
......
'UserProfile',
......
]
# urls.py
urlpatterns = [
path('admin/', admin.site.urls),
# 注冊allauth
path('accounts/', include('allauth.urls')),
# 注冊拓展的用戶模型
path('accounts/',include('UserProfile.urls'))
]
因為我們希望用戶登錄成功後跳轉到profile界面,所以我們在setting.py
中加入這句。
# accounts
LOGIN_REDIRECT_URL = '/accounts/profile/'
第二步,我們來定義拓展信息表。
由於Django自帶的User模型字段郵箱,所以我們需要對其擴展,最便捷的方式就是創建UserProfile的模型,添加我們需要的字段。
定義UserProfile/models.py
from django.db import models
# 導入django自帶的用戶表作為外鍵
from django.contrib.auth.models import User
# Create your models here.
CAMPUS_TYPE = (
('江灣', '江灣'),
('仙溪', '仙溪'),
('河濱', '河濱'),
)
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
name = models.CharField(max_length=50, null=True, blank=True, verbose_name='姓名')
classes = models.CharField(max_length=50, blank=True, verbose_name='所在班級')
bank_card = models.CharField(max_length=50,blank=True,verbose_name='中行卡號')
identity_card = models.CharField(smax_length=18, blank=True, unique=True, verbose_name='身份證號碼')
telephone = models.CharField(max_length=50, blank=True, verbose_name='聯系方式')
campus = models.CharField(choices=CAMPUS_TYPE, max_length=50,blank=True, verbose_name='校區')
modified_date = models.DateTimeField(auto_now=True, verbose_name='最後修改時間')
class Meta:
verbose_name = 'User Profile'
def __str__(self):
return "{}".format(self.user.__str__())
編寫兩個url對應兩個視圖,首先編寫UserProfile內的urls.py
from django.urls import re_path,path
from UserProfile import views
app_name = "UserProfile"
urlpatterns = [
re_path(r'^profile/$', views.profile, name='profile'),
re_path(r'^profile/update/$', views.profile_update, name='profile_update'),
]
兩個對應的視圖函數
from django.shortcuts import render, get_object_or_404
from .models import UserProfile
from .forms import ProfileForm
from django.http import HttpResponseRedirect
from django.urls import reverse
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
user = request.user
return render(request, 'account/profile.html', {'user': user})
@login_required
def profile_update(request):
user = request.user
user_profile = get_object_or_404(UserProfile, user=user)
if request.method == "POST":
form = ProfileForm(request.POST)
if form.is_valid():
# 使用django自帶User中first_name字段存放姓名
user.first_name = form.cleaned_data['name']
user.save()
user_profile.name = form.cleaned_data['name']
user_profile.classes = form.cleaned_data['classes']
user_profile.bank_card = form.cleaned_data['bank_card']
user_profile.identity_card = form.cleaned_data['identity_card']
user_profile.telephone = form.cleaned_data['telephone']
user_profile.campus = form.cleaned_data['campus']
user_profile.save()
return HttpResponseRedirect(reverse('UserProfile:profile'))
else:
default_data = {'name': user_profile.name,
'classes': user_profile.classes,
'bank_card': user_profile.bank_card,
'identity_card': user_profile.identity_card,
'telephone': user_profile.telephone,
'campus': user_profile.campus,
}
form = ProfileForm(default_data)
return render(request, 'account/profile_update.html', {'form': form, 'user': user})
用戶更新資料需要用到表單,所以我們把表單單獨放在forms.py
, 代碼如下所示。我們創建了兩個表單:一個是更新用戶資料時使用,一個是重寫用戶登錄表單。
from django import forms
from .models import UserProfile
from UserProfile.models import CAMPUS_TYPE
class ProfileForm(forms.Form):
name = forms.CharField(label='姓名', max_length=50, required=False)
classes = forms.CharField(label='班級',max_length=50,required=False)
bank_card = forms.CharField(label='中行卡號',max_length=50,required=False)
identity_card = forms.CharField(label='身份證號',max_length=18,required=False)
telephone = forms.CharField(label='聯系方式',max_length=11,required=False)
campus = forms.ChoiceField(label='校區',choices=CAMPUS_TYPE,required=False)
# 重寫注冊表單,注冊的時候創建關聯對象
class SignupForm(forms.Form):
def signup(self, request, user):
user_profile = UserProfile()
user_profile.user = user
user.save()
user_profile.save()
再編寫profile頁面的模板
從github上面的django-allauth拉下來templates
文件夾,放進UserProfile
文件夾中。
隨後在UserProfile/templates/accounts/
目錄下創建profile.html
和profile_update
文件。需要嚴格要求按照上面的目錄結構來創建文件,因為allauth默認會在templates/account/
文件夾下尋找模板文件。
profile.html
{% block content %}
{% if user.is_authenticated %}
<a href="{% url 'UserProfile:profile_update' %}">Update Profile</a> | <a href="{% url 'account_email' %}">Manage Email</a> | <a href="{% url 'account_change_password' %}">Change Password</a> |
<a href="{% url 'account_logout' %}">Logout</a>
{% endif %}
<p>Welcome, {{ user.username }}.</p>
<h2>My Profile</h2>
<ul>
<li>Name: {{ user.profile.name }} </li>
<li>classes: {{ user.profile.classes }} </li>
<li>bank_card: {{ user.profile.bank_card }} </li>
<li>telephone: {{ user.profile.telephone }} </li>
</ul>
{% endblock %}
profile_update.html
{% block content %}
{% if user.is_authenticated %}
<a href="{% url 'UserProfile:profile_update' %}">Update Profile</a> | <a href="{% url 'account_email' %}">Manage Email</a> | <a href="{% url 'account_change_password' %}">Change Password</a> |
<a href="{% url 'account_logout' %}">Logout</a>
{% endif %}
<h2>Update My Profile</h2>
<div class="form-wrapper">
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}
<div class="button-wrapper submit">
<input type="submit" value="Update" />
</div>
</form>
</div>
{% endblock %}
然後就可以使用三板斧查看效果了
python manage.py makemigrations
python manage.yy migrate
python manage.py runserver
新注冊了一個叫做小明的用戶,注冊能夠自動跳轉到profile頁面。
至此,就基本完成了拓展用戶模型的需求。