【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

🤵‍♂️ 个人主页: ​​@计算机魔术师​​ 👨‍💻 作者简介:CSDN内容合伙人,全栈领域优质创作者。 🌐 推荐一款找工作神器网站: ​​宝藏网站​​ |笔试题库|面试经验|实习招聘内推|

【Django | allauth】useprofile 用户模型扩展
该文章收录专栏—【Django | 项目开发】从入门到上线 专栏—
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
@[toc]
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

一、配置项目& 创建文件

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
创建应用​ ​users​
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
python manage.pu statrapp userprofile
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
在项目​ ​setting​​ 文件加上app
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
...    'allauth',    'allauth.account',    'allauth.socialaccount',    "userprofile"]
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 注意!!!: 在 引入 扩展模型应用路由时 *allauth应用 和 userprofile 谁在上方一定要考虑好,不然路由覆盖等会出现页面失效或者报错的情况!!(一般默认allauth在上方)
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
项目 ​​urls.py​
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
from django.contrib import adminfrom django.urls import path, includeurlpatterns = [    path('admin/', admin.site.urls),    path('', userprofile.views.profile),  # 首页 则为信息页(当未登录 自动跳转到login页)    path('accounts/', include('allauth.urls')),    path('accounts/', include('userprofile.urls'))]
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
在​ ​userprofile​​应用的​ ​models.py​​ 创建扩展模型(添加字段)
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
from django.contrib.auth.models import Userfrom django.db import models# Create your models here.class UserProfile(models.Model):    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile")    CAMPUS_CHOICE = (        ('江湾', '江湾'),        ('河滨', '河滨'),        ('仙溪', '仙溪')    )    campus = models.CharField(choices=CAMPUS_CHOICE, max_length=10, verbose_name='campus', blank=True)    tel = models.CharField(max_length=20, verbose_name='telephone', blank=True)    class Meta:        # admin 名称        verbose_name = 'userProfile'        db_table = 'userprofile'    def __str__(self):        return '{}'.format(self.user.__str__())
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 在​ ​admin ​​ 文件 注册​ ​UseProfile​​模型
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
from django.contrib import adminfrom userprofile.models import UserProfile# Register your models here.# 原生注册admin.site.register(UserProfile)
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 三板斧启动服务器(现使用sqlite 数据库,后面再迁移至mysql)
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
python manage.py makmigrationspython manage.py migratepython manage.py runserver
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 注册成功
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

二、 建立表单

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
在应用下建立文件​ ​forms.py​​,并重写表单,
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

由于注册表单时,只会自定创建user对象,并没有创建userprofile并 自动与扩展模型userprofile 进行关联,所以需要 重写注册表单,并 修改默认注册表单配置,注册时两个对象一起被创建,并存储到数据库中。这点非常重要。通过重写表单,你还可以很容易添加其它字段。

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
from django import formsfrom userprofile.models import UserProfileclass UseProfileForm(forms.Form):    CAMPUS_CHOICE = (        ('江湾', '江湾'),        ('河滨', '河滨'),        ('仙溪', '仙溪')    )    tel = forms.CharField(label='Your telephone', max_length=20, strip=True, required=False)    campus = forms.ChoiceField(label='Your campus', choices=CAMPUS_CHOICE, required=False)
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

2.1 重写注册表单

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
有两种方法实现
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

1)自定义表单类 (这里的需求是需要附加输入,建议使用这种方法)

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 原理: allauth应用 根据setting中的​ ​account_signup_form_class ​​的值(路由)引入该表单类,将该表单类的方法​ ​siginup​​ 替换掉原生注册表单
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
自定义表单class SignupForm(forms.Form):    # 对某方法进行重写,注意名字    def signup(self, request, user):        user_profile = UserProfile()        user_profile.user = user        user.save()        user_profile.save()
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 在​ ​setting ​​加上表单配置
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
ACCOUNT_SIGNUP_FORM_CLASS = 'userprofile.forms.SignupForm'
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

2)重写表单( 继承表单类)

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 不需要像定制一样引入表单,直接到表单(所以没有引用循环)
[En]

do not need to introduce the form like customization, direct to the form (so there is no reference loop)*

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
继承(继承用法,保证其 重写注册表单,重联系二者class CustomSignupForm(SignupForm):    # 对某方法进行重写,注意名字    def custom_signup(self, request, user):        user_profile = UserProfile()        user_profile.user = user        user.save()        user_profile.save()
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 在​ ​setting ​​加上表单配置
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
ACCOUNT_FORMS = ({    'reset_password': 'userprofile.forms.ResetPasswordForm',    'signup': 'userprofile.forms.CustomSignupForm'})
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

三、 view 视图函数与 URLs

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* userprofile 的​ ​urls.py​
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
from django.urls import re_pathfrom userprofile import viewsurlpatterns = [    re_path(r'^profile', views.profile, name='profile'),    re_path(r'^profile/update', views.profile_update, name='profile_update')]
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* ​ ​views.py​
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
from django.contrib.auth.decorators import login_requiredfrom django.shortcuts import render, redirect, get_object_or_404,HttpResponseRedirectfrom userprofile.forms import UseProfileFormfrom userprofile.models import UserProfile# Create your views here.@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 = UseProfileForm(request.POST)        if form.is_valid():            user_profile.tel = form.cleaned_data['tel']            user_profile.campus = form.cleaned_data['campus']            user_profile.save()              return HttpResponseRedirect(reverse('PetProfile:profile'))    else:        default_data = {            'tel': user_profile.tel, 'campus': userprofile.campus        }        form = UseProfileForm(default_data)    # 如果时get 返回查看    return render('account/profile_update.html', {'form': form, 'user': user})
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 特别注意!!: 之前文章所注册的用户,在 注册时没有生成&#x200B;<strong>userprofile</strong>&#x200B;​对象,在​ &#x200B; user_profile = get_object_or_404(UserProfile, user=user)&#x200B;​ 这里会报错,所以我们得先注册一个新用户。(修改了注册表单)
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

四、 创建proflie模板和proflie_update模板

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
在​ &#x200B;allauth&#x200B;​ 包中复制粘贴​ &#x200B;templates&#x200B;​ 的​ &#x200B;account&#x200B;​包到该项目的​ &#x200B;templates&#x200B;​的​ &#x200B;account&#x200B;​下,原因:
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
1. 便于模板覆盖
【Django | allauth】useprofile 用户模型扩展
2. 便于修改表单
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 添加​ &#x200B;profile.html&#x200B;​文件
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
{%  block content %}
{% if user.is_authenticated %}
<a href="{% url 'userprofile:profile_update' %}">Update Profilea> | <a href="{% url 'account_email' %}">Manage Emaila> | <a href="{% url 'account_change_password' %}">Change Passworda> |
<a href="{% url 'account_logout' %}">Logouta>
{% endif %}
<p>Welcome,{{ user }}p>

<ul>
<li>name:{{ user.first_name }}li>
<li>telephone:{{ user.profile.tel }}li>
<li>campus:{{ user.profile.campus }}li>
ul>
{% endblock %}

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* ​ &#x200B;profile_update.html&#x200B;
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
{%  block content %}
{% if user.is_authenticated %}
<a href="{% url 'userprofile:profile_update' %}">Update Profilea> | <a href="{% url 'account_email' %}">Manage
Emaila> | <a href="{% url 'account_change_password' %}">Change Passworda> |
<a href="{% url 'account_logout' %}">Logouta>
{% endif %}
<p>Welcome,{{ user }}p>

<div class="form_container">
<form method="post" action="" enctype="multipart/form-data">
{% csrf_token %}
{% for field in form %}
<div class="form-item">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}p>
{% endif %}
div>
{% endfor %}
<div class="button-submit">
<input type="submit" value="Update"/>
div>
form>

div>
{% endblock %}

【Django | allauth】useprofile 用户模型扩展

我们也可以看看 ​ &#x200B;form &#x200B;​表单直接渲染得源代码

【Django | allauth】useprofile 用户模型扩展
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展

五、登入admin管理系统

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 特别注意!!: 我们在登录用户之后,此时 系统是记录我们的用户信息的,而此时如果我们更改路径到admin中,输入我们的管理员账号会报 提供了两个参数的信息,这是因为管理员的用户信息和当前用户信息冲突了, 需要&#x200B;<strong>signout</strong>&#x200B;​ *​当前用户
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
当您输入错误密码时会报告相同的错误(😂已经调试了很长时间)
[En]

The same error will be reported when you enter the wrong password (😂 has been debugged for a long time)

【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
* 效果:
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
参考文献: ​​扩展用户自带模型(allauth)​​ ​​扩展用户自带user模型(非allauth实现)​​ ​​外键related_name​​ ​​def _ str_ (self)​​ ​​def _ str_ (self)​​ ​​verbose_name​​ ​​表单模型和表单的使用​
【Django | allauth】useprofile 用户模型扩展

【Django | allauth】useprofile 用户模型扩展
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")
✨感谢您的阅读。你的点赞和收藏是我创作的最大动力,✨。<details><summary>*<font color='gray'>[En]</font>*</summary>*<font color='gray'>✨ Thank you for your reading. Your likes and collections are the biggest driving force of my creation, ✨.</font>*</details>
![【Django | allauth】useprofile 用户模型扩展](https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230523/"在这里插入图片描述")

Original: https://blog.51cto.com/u_15691039/5581919
Author: 计算机魔术师
Title: 【Django | allauth】useprofile 用户模型扩展

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/500709/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球