美文网首页
Python Web框架 Django - 模型关联关系、模板

Python Web框架 Django - 模型关联关系、模板

作者: 莫名ypc | 来源:发表于2018-11-29 17:27 被阅读0次

    模型定义与一对多关系

    指定一对多的关联关系,foreignkey定义在多的一方
    模型定义:

    class Grade(models.Model):
        g_name = models.CharField(max_length=10)
        create_time = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            db_table = 'grade'
    
    
    class Student(models.Model):
        name = models.CharField(max_length=10, unique=True, verbose_name='姓名')
        age = models.IntegerField(default=18, verbose_name='年龄')
        gender = models.BooleanField(default=1, verbose_name='性别')
        # auto_now_add:创建数据时,默认create_time字段为当前时间
        create_time = models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')
        # auto_now:修改时间,每次update学生信息时,修改该字段的时间为当前的时间
        operate_time = models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')
        chinese = models.DecimalField(max_digits=4, decimal_places=1, null=True, verbose_name='语文')
        math = models.DecimalField(max_digits=4, decimal_places=1, null=True, verbose_name='数学')
        # 指定学生和班级的关联关系,foreignkey定义在多的一方
        g = models.ForeignKey(Grade, null=True)
    
        def __str__(self):
            return self.name
    
        class Meta:
            # 指定student模型映射到数据库中时,对应的表名
            db_table = 'student'
            verbose_name = '学生'
            verbose_name_plural = '学生'
    

    一对多的正向查询和反向查询

    正向查询

    def sel_grade_by_stu(request):
        stu = Student.objects.filter(name='貂蝉').first()
        name = stu.g.g_name
        return HttpResponse(name)
    

    反向查询

    def sel_stu_by_grade(request):
        grade = Grade.objects.filter(g_name='Java').first()
        stus = grade.student_set.all()
        return HttpResponse(stus)
    

    多对多关联关系

    模型定义: ManyToManyField字段定义在关联的任何一个模型中都可以

    class Course(models.Model):
        c_name = models.CharField(max_length=10)
        # ManyToManyField字段定义在关联的任何一个模型中都可以
        stu = models.ManyToManyField(Student)
    
        class Meta:
            db_table = 'course'
    

    完成迁移后,后生成course表和course_stu的中间表


    1.JPG

    添加和删除多对多关联关系

    def stu_cou(request):
        # 添加学生和课程的关系
        # 给 貂蝉 加线代课
        stu = Student.objects.get(name='貂蝉')
        cou = Course.objects.get(c_name='线代')
        # 通过人查询课程,并添加课程
        stu.course_set.add(cou)
        # 删除人的课程
        stu.course_set.remove(cou)
        return HttpResponse('添加和删除学生和课程之间的关联关系')
    

    模板

    在项目和应用的同一级目录创建templates文件夹,用于存放模板文件
    在settings文件中配置模板路径

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    

    创建路由:

    # 返回首页index.html
    url('^index/', views.index),
    

    在views.py文件中使用render方法渲染页面

    def index(request):
        stus = Student.objects.all()
        return render(request, 'index.html', {'students': stus})
    

    for 循环 和 List内容的显示

    {% for i in TutorialList %}
    {{ i }}
    {% endfor %}
    

    遍历字典

    {% for key, value in info_dict.items %}
        {{ key }}: {{ value }}
    {% endfor %}
    

    forloop变量

    变量 描述
    forloop.counter 索引从 1 开始算
    forloop.counter0 索引从 0 开始算
    forloop.revcounter 索引从最大长度到 1
    forloop.revcounter0 索引从最大长度到 0
    forloop.first 当遍历的元素为第一项时为真
    forloop.last 当遍历的元素为最后一项时为真
    forloop.parentloop 用在嵌套的 for 循环中,获取上一层 for 循环的 forloop

    for - empty - endfor

    <ul>
    {% for athlete in athlete_list %}
        <li>{{ athlete.name }}</li>
    {% empty %}
        <li>抱歉,列表为空</li>
    {% endfor %}
    </ul>
    

    模板中的逻辑操作

    ==, !=, >=, <=, >, < 这些比较都可以在模板中使用

    {% if var >= 90 %}
    成绩优秀,自强学堂你没少去吧!学得不错
    {% elif var >= 80 %}
    成绩良好
    {% elif var >= 70 %}
    成绩一般
    {% elif var >= 60 %}
    需要努力
    {% else %}
    不及格啊,大哥!多去自强学堂学习啊!
    {% endif %}
    

    and, or, not, in, not in 也可以在模板中使用
    假如我们判断 num 是不是在 0 到 100 之间:

    {% if num <= 100 and num >= 0 %}
    num在0到100之间
    {% else %}
    数值不在范围之内!
    {% endif %}
    

    假如我们判断 'ziqiangxuetang' 在不在一个列表变量 List 中:

    {% if 'ziqiangxuetang' in List %}
    自强学堂在名单中
    {% endif %}
    

    静态资源

    创建static文件夹,存放css、js等文件
    在settings.py文件中配置静态文件加载路径

    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static')
    ]
    

    继承

    两种加载方法:
    第一种:

    {% block css %}
      <link href="/static/css/index.css" rel="stylesheet">
    {% endblock %}
    

    第二种:

    {% block css %}
        {% load static %}
        <link href="{% static 'css/index.css' %}" rel="stylesheet">
    {% endblock %}
    

    模板之间的继承

    base.html、base_main.html、index.html
    base.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>
            {% block title %}
            {% endblock %}
        </title>
        {% block css %}
        {% endblock %}
    
        {% block js %}
    
        {% endblock %}
    
    </head>
    <body>
        {% block content %}
        {% endblock %}
    </body>
    </html>
    

    base_main.html

    {% extends 'base.html' %}
    
    {% block js %}
        <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
    {% endblock %}
    

    index.html

    {% extends 'base_main.html' %}
    
    {% block title %}
        标题
    {% endblock %}
    
    {% block css %}
    {#    <link href="/static/css/index.css" rel="stylesheet">#}
        {% load static %}
        <link href="{% static 'css/index.css' %}" rel="stylesheet">
    {% endblock %}
    
    {% block js %}
        {{ block.super }}
        <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    {% endblock %}
    
    {% block content %}
    
    {% endblock %}
    

    相关文章

      网友评论

          本文标题:Python Web框架 Django - 模型关联关系、模板

          本文链接:https://www.haomeiwen.com/subject/zjdxcqtx.html