• Python全栈之路-Django(十二)


    1 相亲网

    1.1 需求分析

    1 登录,基于Session,装饰器

    2 数据表:

    男生表:

    id    username  password
    

    女生表

    id    username  password
    

    男生女生关系表

    id	nid  nid	
    

    3 功能:

    登录页:

    用户名:
    密码:
    性别:
    一周免登录:checkbox
    	
    session[id]
    session[xingbie]
    

    查看异性列表:

    session[xingbie]
    

    查看与自己有染得异性姓名列表

    1.2 简单示例:

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import account,love
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^login.html/', account.login),
        url(r'^index.html/', love.index),
        url(r'^logout.html/', account.logout),
        url(r'^others.html/', love.others),
    ]
    

    app01.models.py

    from django.db import models
    
    
    class Boy(models.Model):
        nickname = models.CharField(max_length=32)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
    
    
    class Girl(models.Model):
        nickname = models.CharField(max_length=32)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
    
    
    class B2G(models.Model):
        b = models.ForeignKey(to='Boy',to_field='id')
        g = models.ForeignKey(to='Girl',to_field='id')
    

    app01.views.account.py

    #!/usr/bin/env python
    # __Author__: "wanyongzhen"
    # Date: 2017/7/6
    from django.shortcuts import HttpResponse,render,redirect
    from app01 import models
    
    def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
        else:
            user = request.POST.get('username')
            pwd = request.POST.get('password')
            gender = request.POST.get('gender')
            rmb = request.POST.get('rmb')
            # 性别判断
            if gender == '1':
                obj = models.Boy.objects.filter(username=user,password=pwd).first()
            else:
                obj = models.Girl.objects.filter(username=user,password=pwd).first()
    
            if not obj:
                # 未登录成功
                return render(request,'login.html',{'msg':'用户名或密码错误'})
            else:
                # request.session['user_id'] = obj.id
                # request.session['gender'] = gender
                # request.session['username'] = user
                # 大字典写法
                request.session['user_info'] = {
                    'user_id':  obj.id,
                    'gender':   gender,
                    'username': user,
                    'nickname': obj.nickname
                }
                return redirect('/index.html/')
    
    
    def logout(request):
        # 删除Session 会删除数据库中的数据
        # request.session.delete(request.session.session_key)
        # 只删除Cookie 不会删除数据库中的数据
        request.session.clear()
    
        return redirect('/login.html/')
    

    app01.views.love.py

    #!/usr/bin/env python
    # __Author__: "wanyongzhen"
    # Date: 2017/7/6
    
    from django.shortcuts import HttpResponse,render,redirect
    from app01 import models
    
    def index(request):
        if not request.session.get('user_info'):
            return redirect('/login.html')
        else:
            gender = request.session.get('user_info').get('gender')
            if gender == '1':
                user_list = models.Girl.objects.all()
                return render(request, 'index.html', {'user_list': user_list})
            else:
                user_list = models.Boy.objects.all()
    
                return render(request,'index.html', {'user_list': user_list})
    
    def others(request):
        """
        获取与当前用户有关系的异性
        :param request: 
        :return: 
        """
        current_user_id = request.session.get('user_info').get('user_id')
        gender = request.session.get('user_info').get('gender')
        if gender == '1':
            user_list = models.B2G.objects.filter(b_id=current_user_id).values('g__nickname')
        else:
            user_list = models.B2G.objects.filter(b_id=current_user_id).values('b__nickname')
        return render(request, 'others.html',{'user_list': user_list})
    

    templates.login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/login.html/" method="post">
        {% csrf_token %}
        <p>用户:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="password"></p>
        <p>
            性别:
            男<input type="radio" name="gender" value="1">
            女<input type="radio" name="gender" value="2">
        </p>
        <p><input type="checkbox" name="rmb" value="0">一个月免登陆</p>
        <input type="submit" value="提交">{{ msg }}
    
    </form>
    </body>
    </html>
    

    templates.index.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        {% include 'user_header.html' %}
        <h3>异性列表</h3>
        <a href="/others.html">和我有关系的异性</a>
    
    <ul>
        {% for user in user_list %}
        <li>{{ user.nickname }}</li>
        {% endfor %}
    
    </ul>
    </body>
    </html>
    

    templates.others.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    {% include 'user_header.html' %}
    <h1>有关系的异性列表</h1>
    <ul>
    {% for user in user_list %}
        <li>{{ user.b__nickname }}{{ user.g__nickname }}</li>
    {% endfor %}
    </ul>
    
    </body>
    </html>
    templates.user_header.html
    <h1>当前用户:{{ request.session.user_info.nickname }}</h1>
    <a href="/logout.html">注销</a>
    

    2 自关联related_name

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/', views.test),
    ]
    

    app01.models.py

    from django.db import models
    
    
    class UserInfo(models.Model):
        nickname = models.CharField(max_length=32)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        gender_choices = (
            (1, '男'),
            (2, '女'),
        )
        gender = models.IntegerField(choices=gender_choices)
    
    
    # relate_query_name  反向关联别名,保留_set
    # obj对象男.b_set.all()
    # obj对象女.a_set.all()
    # relate_name(推荐) 反向关联别名
    # obj对象男.b.all()
    # obj对象女.a.all()
    class U2U(models.Model):
        # g = models.ForeignKey('UserInfo', related_query_name='a')
        # b = models.ForeignKey('UserInfo', related_query_name='b')
        g = models.ForeignKey('UserInfo', related_name='boys')
        b = models.ForeignKey('UserInfo', related_name='girls')
    

    app01.views.py

    from django.shortcuts import render, HttpResponse
    from app01 import models
    # Create your views here.
    
    
    def test(request):
        # models.U2U.objects.create(b_id=2, g_id=6)
        # models.U2U.objects.create(b_id=1, g_id=6)
        # models.U2U.objects.create(b_id=1, g_id=4)
        # models.U2U.objects.create(b_id=1, g_id=5)
    
        # boy = models.UserInfo.objects.filter(gender=1, id=2).first()
        # girl = models.UserInfo.objects.filter(gender=2, id=6).first()
        # models.U2U.objects.create(b=boy, g=girl)
    
        xz = models.UserInfo.objects.filter(id=1).first()
        result = xz.girls.all()  # <QuerySet [<U2U: U2U object>, <U2U: U2U object>, <U2U: U2U object>]>
        for u in result:
            print(u.g.nickname)
        return HttpResponse('...')
    

    3 manytomany自关联

    urls.py

    from django.conf.urls import url
    from django.contrib import admin
    from app01 import views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^test/', views.test),
    ]
    

    app01.models.py

    from django.db import models
    
    
    class UserInfo(models.Model):
        nickname = models.CharField(max_length=32)
        username = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        gender_choices = (
            (1, '男'),
            (2, '女'),
        )
        gender = models.IntegerField(choices=gender_choices)
        m = models.ManyToManyField('UserInfo')
    

    app01.views.py

    from django.shortcuts import render, HttpResponse
    from app01 import models
    # Create your views here.
    
    
    def test(request):
        # 查男生(正向操作)
        # xz = models.UserInfo.objects.filter(id=1).first()
        # u = xz.m.all()  # <QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]>
        # for row in u:
        #     print(row.nickname)
    
        # 查女生(反向操作)
        mr = models.UserInfo.objects.filter(id=4).first()
        v = mr.userinfo_set.all()
        for row in v:
            print(row.nickname)
    
        return HttpResponse('...')
    

    4 ForeignKey自关联

    class Comment(models.Model):
        """
        评论表
        """
        news_id = models.IntegerField()            # 新闻ID
        content = models.CharField(max_length=32)  # 评论内容
        user = models.CharField(max_length=32)     # 评论者
        reply = models.ForeignKey('Comment',null=True,blank=True,related_name='xxxx')
    """
        新闻ID                         reply_id
    1   1        别比比    root         null
    2   1        就比比    root         null
    3   1        瞎比比    shaowei      null
    4   2        写的正好  root         null
    5   1        拉倒吧    由清滨         2
    6   1        拉倒吧1    xxxxx         2
    7   1        拉倒吧2    xxxxx         5
    """
    """
    新闻1
        别比比
        就比比
            - 拉倒吧
                - 拉倒吧2
            - 拉倒吧1
        瞎比比
    新闻2:
        写的正好
    """
    

    5 中间件

    m1.py

    from django.utils.deprecation import MiddlewareMixin
    from django.shortcuts import HttpResponse
    
    class Middle1(MiddlewareMixin):
        def process_request(self, request):
            print('m1.process_request')
            # return HttpResponse('不要再往下执行了')  # 这里返回值后,下面的中间件和函数将不会被执行
    
        def process_response(self, request, response):
            print('m1.process_response')
            return response
    
    class Middle2(MiddlewareMixin):
        def process_request(self, request):
            print('m2.process_request')
            # return HttpResponse('不要再往下执行了')  # 这里返回值后,下面的中间件和函数将不会被执行
    
        def process_response(self, request, response):
            print('m2.process_response')
            return response
    

    settings.py

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
        'm1.Middle1',
        'm1.Middle2',
    ]
    
  • 相关阅读:
    ZOJ 3954 Seven-Segment Display
    ZOJ 3955 Saddle Point
    ZOJ 3950 How Many Nines
    ZOJ 3957 Knuth-Morris-Pratt Algorithm
    PAT L2-018. 多项式A除以B
    hihocoder 1500 EL SUENO
    hihocoder 1498 Diligent Robots
    hihocoder 1497 Queen Attack
    hihocoder 1490 Tree Restoration
    SCU 4443 Range Query
  • 原文地址:https://www.cnblogs.com/wanyuetian/p/7132795.html
Copyright © 2020-2023  润新知