django-allauth 教程(二) 一鼓作气

会飞的鱼 等级 430 0 0

前言:上一篇:django-allauth(一)小试牛刀 介绍了django-allauth的安装及基本使用(如用户的注册,登录,邮箱验证和密码重置),然而allauth并没有提供展示和修改用户资料的功能,也没有对用户资料进行扩展。那么本篇就来介绍如何拓展用户个人资料和修改个人资料。一个在用户登录后跳转到个人信息页面(/accounts/profile/),一个允许登录用户编辑个人资料/accounts/profile/update/)。

1.创建一个APP,叫做myaccount

这里教大家一个便捷使用 python manage.py shell 的方法。 首先打开manage.py文件,然后在pycharm中找到菜单栏的工具,如图:

django-allauth 教程(二) 一鼓作气 点击后,会出现 django-allauth 教程(二) 一鼓作气 这样就可以不用每次在terminal中输入python manage.py ... 比如createsuperuser, startapp, migrate,makemigrations 其次呢我创建一个源码目录apps/,用来放自己的APP, django-allauth 教程(二) 一鼓作气 再创建一个源码目录extra_apps/,用来存放额外添加的APP,比如百度的富文本编辑器UEditor,xadmin等 django-allauth 教程(二) 一鼓作气 将其加入到settings.py配置文件INSTALLED_APP里去,同时把urls也加入到项目的urls里去,如下图所示。 House_website/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'allauth.socialaccount.providers.github',
    'myaccount',
]

为了方便国内开发者,我建议在settings.py里添加

LANGUAGE_CODE = 'zh-hans'  # 中文支持,时区为中国上海

TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = False

2.编写模型

由于Django自带的User模型字段邮箱,所以我们需要对其扩展,最便捷的方式就是创建UserProfile的模型,如下所示。我们添加了需要拓展的字段。

myaccount/models.py

from django.db import models
from django.contrib.auth.models import User
from allauth.account.models import EmailAddress
# Create your models here.


class UserProfile(models.Model):
    """用户"""
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
    org = models.CharField('Organization', max_length=128, blank=True)
    birthday = models.DateField(null=True, blank=True, verbose_name='出生日期')
    gender = models.CharField(max_length=6, choices=(('male', u'男'), ('female', u'女')), default='female',
                              verbose_name='性别')
    age = models.IntegerField(verbose_name='年龄', null=True)
    QQ = models.CharField(max_length=20, null=True, blank=True, verbose_name='QQ', default='')

    telephone = models.CharField(max_length=50, null=True, blank=True, verbose_name='电话', default='')

    signature = models.TextField(max_length=500, verbose_name='个性签名',default='',null=True)

    mod_date = models.DateTimeField('Last modified', auto_now=True, )

    is_delete = models.BooleanField(default=False, verbose_name='是否删除')

    class Meta:
        verbose_name = 'User Profile'

    def __str__(self):
        return "{}'s profile".format(self.user.__str__())

# models.py中新定义一个account_verified方法,来提醒邮箱是否验证
    def account_verified(self):
        if self.user.is_authenticated:
            result = EmailAddress.objects.filter(email=self.user.email)
            if len(result):
                return result[0].verified
            else:
                return False
        else:
            return False

3.编写urls

House_website/House_website/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
    path('accounts/', include('myaccount.urls')),
]

4.编写视图函数

myaccount/views.py

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():
            user.first_name = form.cleaned_data['first_name']
            user.last_name = form.cleaned_data['last_name']
            user.save()

            user_profile.org = form.cleaned_data['org']
            user_profile.birthday = form.cleaned_data['birthday']
            user_profile.age = form.cleaned_data['age']
            user_profile.gender = form.cleaned_data['gender']
            user_profile.QQ = form.cleaned_data['QQ']
            user_profile.telephone = form.cleaned_data['telephone']
            user_profile.signature = form.cleaned_data['signature']
            user_profile.save()

            return HttpResponseRedirect(reverse('myaccount:profile'))
    else:
        default_data = {'first_name': user.first_name, 'last_name': user.last_name, 'org': user_profile.org,
                        'telephone': user_profile.telephone, }
        form = ProfileForm(default_data)

    return render(request, 'account/profile_update.html', {'form': form, 'user': user})

5.编写表单

在myaccount/下新建一个forms.py 我们用户更新资料需要用到表单,所以我们把表单单独放在forms.py, 代码如下所示。我们创建了两个表单:一个是更新用户资料时使用,一个是重写用户注册表单。

from django import forms
from .models import UserProfile


class ProfileForm(forms.Form):
    first_name = forms.CharField(label='First Name', max_length=50, required=False)
    last_name = forms.CharField(label='Last Name', max_length=50, required=False)
    org = forms.CharField(label='Organization', max_length=50, required=False)
    telephone = forms.CharField(label='Telephone', max_length=50, required=False)
    birthday = forms.DateField(label="birthday", required=False)
    age = forms.IntegerField(label='age', required=False)
    gender = forms.CharField(label="gender", widget=forms.RadioSelect(
        choices=(('female', '女'), ('male', '男'))), initial=('female', '女'), required=False)
    QQ = forms.CharField(label='QQ', required=False, max_length=20)
    signature = forms.CharField(label='signature', required=False, max_length=500)


class SignupForm(forms.Form):

    def signup(self, request, user):
        user_profile = UserProfile()

        user_profile.user = user
        user.save()
        user_profile.save()

为什么我们需要重写用户注册表单?因为django-allauth在用户注册只会创建User对象,不会创建与之关联的UserProfile对象,我们希望用户在注册时两个对象一起被创建,并存储到数据库中。这点非常重要。通过重写表单,你还可以很容易添加其它字段。

要告诉django-allauth使用我们自定义的注册表单,我们只需要在settings.py里加入一行。

ACCOUNT_SIGNUP_FORM_CLASS = 'myaccount.forms.SignupForm'

6.编写模板

因为django-allauth默认会在templates/account/文件夹下寻找模板文件,为方便后续集中美化模板,我们也把模板文件放在这个文件夹中。 templates/account/profile.html

{% load account %}
{% block content %}
{% if user.is_authenticated %}
<a href="{% url 'myaccount: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 }}.
    {% if not user.profile.account_verified %}
    (Unverified email.)
    {% endif %}
</p>


<h2>My Profile</h2>
<ul>
    <li>First Name: {{ user.first_name }} </li>
    <li>Last Name: {{ user.last_name }} </li>
    <li>Organization: {{ user.profile.org }} </li>
    <li>Telephone: {{ user.profile.telephone }} </li>
        <li>birthday: {{ user.profile.birthday }} </li>
        <li>age: {{ user.profile.age }} </li>
        <li>gender: {{ user.profile.gender }} </li>
        <li>QQ: {{ user.profile.QQ }} </li>
        <li>signature: {{ user.profile.signature }}</li>
</ul>


{% endblock %}

templates/account/profile_update.html

{% block content %}
{% if user.is_authenticated %}
<a href="{% url 'myaccount: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 %}

7.查看效果

在Terminal输入以下命令:

python manage.py makemigrations  # 生成映射文件
# 如果之前生成过映射文件,那就把之前的映射文件删除
# \House_website\apps\myaccount\migrations\0001_initial.py
python manage.py migrate  # 执行映射文件,创建数据表
python manage.py runserver   # 运行服务

下面是django_allauth所有内置的URLs,均可以访问的。

/accounts/login/(URL名account_login): 登录

/accounts/signup/ (URL名account_signup): 注册

/accounts/password/reset/(URL名: account_reset_password) :重置密码

/accounts/logout/ (URL名account_logout): 退出登录

/accounts/password/set/ (URL名:account_set_password): 设置密码

/accounts/password/change/ (URL名: account_change_password): 改变密码(需登录)

/accounts/email/(URL名: account_email) 用户可以添加和移除email,并验证

/accounts/social/connections/(URL名:socialaccount_connections): 管理第三方账户

如果没账号,先注册一个,我就不演示了,

登录之后会进入profile页面:

django-allauth 教程(二) 一鼓作气

点击上方Update Profile,进入个人信息修改页面:


django-allauth 教程(二) 一鼓作气


输入信息后点击下方的Update 按钮就可以完后修改,重定向到/accounts/profile/ ,个人信息就修改完成了!

到这里本篇久写完了,希望大家点个赞支持一下!

特别鸣谢:大江狗前辈 声明:我写博客只是记录自己的学习进度和总结并分享给大家,并不保证原创,如有引用您的博文,请您理解!

收藏
评论区

相关推荐

python实现——最优化算法(二分法、格点法、黄金分割法、牛顿法等)
二分法 函数详见rres,此代码使该算法运行了两次 python def asdf(x): rres8x32x27x3 return rres i2 left0 right1 while i0 : i i1 ans 0.1 mid1 (left right ans) / 2
折半查找-Python版(二分查找)
介绍 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 前提 必须待查找的序列有序 时间复杂度 O(log2n) 原理 1)确定该期间的中间位置K 2)将查找的值t与arrayk比较,若相等,查找成功返回此位置;否则确定新的查找区域,继续二分
python基础知识总结
一、Python的优缺点 优点: 1. 简单,易学,免费,开源 2. 高级语言,解释型语言 3. 可移植性,可拓展性,可读性 4. 面向对象,丰富的库 缺点: 1. 执行效率慢 2. GIL锁限制并发 3. 源代码加密困难 二、Python的注释
12. 数据放在本地,心里才更踏实,滚雪球学 Python
今天是持续写作的第 <font color"red"12</font / 100 天。 如果你有想要交流的想法、技术,欢迎在评论区留言。 本篇文章要讲解的内容是 Python 文件操作的相关内容,滚雪球学 Python 第一遍已经进行到中途,是否还能坚持住呢?加油。 十二、Python 文件读取与写入 电脑文件的操作是任何一门编程语言都会涉
14. Python 与数据库那点事儿,滚雪球学 Python
本篇文章将给大家介绍 Python 如何操作 SQLite 数据库,本文将是滚雪球学 Python 第一阶段的倒数第二篇文章。 <center<font color
Python Django开发 经验技巧总结(二)
1.模板中变量的运算(1)加法markup{{value|add:value2}}返回的结果是valuevalue2的值,假设你value为40,value2为60 ,则该表达式返回结果为100(2)减法markup{{value|add value2}}与加法的性质一样,只不过是把第二个参数变成负数进行运算,返回的结果是va
Python SQLite 基本操作和经验技巧(二)
1.sqlite3模块删除整个数据表test1.db是整个数据库文件,而不是一个表,它可以包括多个表pythonimport osos.unlink("test1.db")用上面的代码删除test1.db文件如要删除单个表people:pythoncon.execute('drop table people') 2.用pytho
Python Django开发 异常及解决办法(二)
1.Django xadmin数据迁移报错ImportError: cannot import name 'QUERY_TERMS'在进行Django xadmin数据迁移时报错:pythonfrom django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMSImportError: cann
商业数据分析从入门到入职(8)Python模块、文件IO和面向对象
前言本文先介绍了Python中程序、模块和包的基本使用,并在此基础上介绍了Python标准库。然后详细介绍了Python中的文件IO操作,包括文本文件、二进制文件的读写和其他IO操作。最后介绍了面向对象,包括类的定义、继承的使用、鸭子类型和魔法方法。 一、程序、模块和包 1.自定义模块和包之前我们使用的.ipynb文件都不是纯Python文件,
如何用python制作动态二维码,来哄女朋友开心?
↑ 关注 + 星标  有趣的不像个技术号每晚九点,我们准时相约   大家好,我是朱小五 如何用python制作动态二维码,来哄女朋友开心? 这句话前半部分相信大家已经很熟悉了,很多同学也给自己的网站地址做过图片为底的二维码。 后半部分呢?那肯定要增加一些趣味啊,不然岂不是对不起凹凸数据的solgan。 先看看在抖音上超级火的视频吧。 原
Frida + AndroidAsync 实现 RPC
一、目标我们在之前的教程里面使用 python的Flask库启动一个web Server 来实现App函数的RPC调用。今天我们介绍一个新盆友,AndroidAsync, 用AndroidAsync来启动web Server,这样frida就直接搞定,不需要再请Python来帮忙了。 二、步骤 AndroidAsyncAndroidAsync的详细介绍大家可
怎么学python,学习python的正确姿势
Python是一门相对来说比较简单的编程语言,自学是非常轻松的。首先得明白python有哪些发展方向 需要了解这个这门语言 而不是听说 这个高薪资 容易学习最好的学习状态就是出于兴趣 兴趣是最好的老师 当然对钱感兴趣也是可以的。一、人工智能二、大数据三、网络爬虫工程师四、Python web全栈工程师五、Python自动化运维六、Python自动化测试再来说
浅谈Python两大爬虫库——urllib库和requests库区别
一、前言在使用Python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装。那它们两者有什么区别 ?下面通过案例详细的讲解 ,了解他们使用的主要区别。 二、urllib库 简介:urllib库的response对象是先创建http,request对象
python的这些必备干货知识点,快来看看有没有你不了解的?
Python是当前主流的编程语言之一,其优点有:一:语法简洁,可以让使用者用少量的代码完成相对复杂的效果。二:标准库和第三库多,功能强大;三:站在了人工智能和大数据的风口上;像国内的豆瓣呀,知乎呀等等知名网站都是基于python开发的,而Youtube、Reddit、Dropbpx也是用python的框架开发的。近几年学习python的小伙伴越来越多,那么p
盘点一款Python二级考试模拟软件,带你轻松过关二级Python考试
大家好,我是Python进阶者。今天给大家讲的这个软件,主要是想让大家通过这个软件能将自己的Python基础进一步提高。一、前言相信有些小伙伴学习Python有一段时日,但是又不知道自己的Python基础学的如何,这个时候就需要一款神器来检测一下自己的Python基础了。要想检测自己的Python功力最直观的方法当然是做题了,至于做什么题了我们就不得而知了,

热门文章

django-allauth 教程(一)小试牛刀

最新文章

django-allauth 教程(一)小试牛刀