Django 08.17
1.模型:
自关联
- 
多对多关联
class User(models.Model): name = models.CharField(max_length=32) gender_list = [ (1,"男"), (2,"女"), ] gender = models.IntegerField(choices=gender_list,default=1) m =models.ManyToManyField('User') def test(request): ### 自关联 ''' from_user_id : 男生的id to_user_id: 女生id ''' #### 查询和zekai约会的姑娘 res = models.User.objects.filter(name='zekai', gender=1).first() #print(res) ### obj objs = res.m.all() ''' 1. select * from app01_user_m where from_user_id = 1 ### to_user_id=[3,4] 2. select * from app01_user where id in (3,4) ''' for obj in objs: print(obj.name) #### 查询和cuihua约会的男生 res = models.User.objects.filter(name='cuihua', gender=2).first() objs = res.user_set.all() ''' 1. select * from app01_user_m where to_user_id = 3 ### from_user_id=[1,2] 2. select * from app01_user where id in (1,2) ''' for obj in objs: print(obj.name) return HttpResponse('ok') - 
一对多关联django_admin_log
class article(models.Model): title = models.TextField() class Comment(models.Model): content = models.CharField(max_length=255) article = models.ForeignKey("article") reply = models.ForeignKey("Comment",default=0) 
auth模块:
django内置的模块
auth_user表记录的添加
- 创建超级用户(不可手动插入,因为密码是加密的)
 - 简单使用auth认证
 
from django.contrib import auth
def login(request):
  if request.method == 'POST':
    name = request.POST.get('name')
    pwd = request.POST.get('pwd')
    user = auth.authenticate(request,username=name,password=pwd)
    # 类似于user=models.User.objects.filter(username=name,password=pwd).first()
    if user:
      return redirect('/home/')
  return render(request,'login.html')
def test1(request):
    if request.user.is_authenticated:
        return HttpResponse("OK")
    else:
        return render(request,"login.html")
from django.contrib.auth.decorators import login_required
@login_required()
def test1(request):
    return HttpResponse("OK")
# 可以在配置文件中指定auth校验登陆不合法统一跳转到某个路径
LOGIN_URL = '/login/'  # 既可以局部配置,也可以全局配置
### auth 模块注册
from django.contrib.auth.models import User
def register(request):
    if request.method  == 'GET':
        return render(request, 'register.html')
    else:
        username = request.POST.get('username')
        pwd = request.POST.get('pwd')
        # User.objects.create_superuser(username=username, password=pwd, email='111@qq.com')
        User.objects.create_user(username=username, password=pwd)
    return HttpResponse('ok')
- 
注销
auth.logout(request) # 等价于删除session数据 request.session.flush() - 
校验密码,修改密码
### 修改密码 def modify(request): if request.method=='GET': return render(request, 'modify.html') else: old_pwd = request.POST.get('oldpwd') new_pwd = request.POST.get('newpwd') res = request.user.check_password(old_pwd) if res: request.user.set_password(new_pwd) request.user.save() return HttpResponse('ok') else: return render(request, 'modify.html') 
自定义模型表应用auth功能
如何扩张auth_user表?
- 
一对一关联(不推荐)
from django.contrib.auth.models import User class UserDetail(models.Models): phone = models.CharField(max_length=11) user = models.OnoToOneField(to=User) - 
面向对象的继承
from django.contrib.auth.models import User,AbstractUser class UserInfo(AbstractUser): phone = models.CharField(max_length=32) # 需要在配置文件中,指定我不再使用默认的auth_user表而是使用我自己创建的Userinfo表 AUTH_USER_MODEL = "app名.models里面对应的模型表名" """ 自定义认证系统默认使用的数据表之后,我们就可以像使用默认的auth_user表那样使用我们的UserInfo表了。 库里面也没有auth_user表了,原来auth表的操作方法,现在全部用自定义的表均可实现 """ 
layUI的使用:
                    
                
                
            
        
浙公网安备 33010602011771号