1,app01/models.py 里面创建模型 UserExtension, 一对一关联 User
- from django.db import models
- from django.contrib.auth.models import User
- from django.dispatch import receiver
- from django.db.models.signals import post_save
- class UserExtension(models.Model):
- user = models.OneToOneField( User, related_name="extension", on_delete= models.CASCADE )
- telephone = models.CharField(max_length=11)
- school = models.CharField(max_length=100)
- '''
- sender 发送者
- instance 代表调用的对象
- created 是否是新创建
- 如果是新建 User 对象, 则 User 扩展对象 UserExtension 里面创建与 User 的关联
- 如果不是新建, User 保存一次, 则 User 扩展对象 UserExtension 也自动保存
- '''
- @receiver(post_save, sender = User)
- def create_user_extension( sender, instance, created, **kwargs ):
- if created:
- UserExtension.objects.create( user = instance)
- else:
- instance.extension.save()
2, 执行 makemigrations 和 migrate, 同步映射数据库
2,app01/views.py 视图调用扩展模型, 创建 User 和 UserExtension 对象
- from django.shortcuts import render, HttpResponse
- from django.db import connection
- from django.contrib.auth.models import User
- def test(request):
- user = User.objects.create_user( username="zhiliao3", password="333333", email="[email protected]" )
- user.extension.telephone = "18888688888"
- user.save()
- return HttpResponse("success")
通过 url: http://127.0.0.1:8080/test 访问后, 数据库就创建 User 和 UserExtension 相关的数据:
3, 若需要使用 telephone 和 password 方式验证用户, 需要自定义验证方法
- from django.shortcuts import render, HttpResponse
- from django.db import connection
- from django.contrib.auth.models import User
- def my_authenticate(telephone, password):
- user = User.objects.filter( extension__telephone= telephone ).first()
- if user:
- is_correct = user.check_password( password)
- if is_correct:
- return user
- else:
- return None
- else:
- return None
- def test(request):
- # user = User.objects.create_user( username="zhiliao3", password="333333", email="[email protected]" )
- # user.extension.telephone = "18888688888"
- # user.save()
- telephone = request.GET.get("telephone")
- password = request.GET.get("password")
- user = my_authenticate( telephone, password)
- if user:
- print("验证成功:%s" % user.username)
- else:
- print("验证失败!")
- return HttpResponse("success")
通过 URL 访问:
打印结果如下:
erforming system checks...
- System check identified no issues (0 silenced).
- November 05, 2019 - 16:11:31
- Django version 2.2.2, using settings 'untitled1019.settings'
- Starting development server at http://127.0.0.1:8080/
Quit the server with CTRL-BREAK.
验证成功: zhiliao3
来源: http://www.bubuko.com/infodetail-3273804.html