Django模板和视图

1-model的继承

什么时候使用:当model出现很多相同的字段时,可以选择使用,举例:定义Teacher和Stu两个类,都有相同的属性:姓名,年龄,性别。为方便操作,这时就可以来额外定义一个human类,来定义这三个属性,话不多说,贴代码如下:

class Human(models.Model):
    name=models.CharField(
        verbose_name="姓名",
        max_length=20
    )
    age=models.IntegerField(
        verbose_name="年龄"
    )
    sex=models.CharField(
        verbose_name="性别",
        max_length=10
    )
    #当model出现很多重复的字段时,可以写一个合理的抽象类
    class Meta:
         abstract=True

class Stu(Human):
    score=models.IntegerField(
        verbose_name="成绩"
    )

class Teacher(Human):
    salary=models.IntegerField(
        verbose_name="薪水"
    )

这样,在执行完数据迁移后,我们就可以在相应的数据库中看到两个名为项目名_teacher和项目名_stu的两个数据表,划重点:

class Meta:
     abstract=True
    

        一定要写在需要继承的那个(Human)里面。

2-模板的处理过程

模板的处理过程分为加载和渲染,在这里先介绍原生写法(views.py):

def get_teacher(req):
    res = Teacher.objects.all()
    return render(req,
                  'templates/teach04/teachers.html',
                  context={'teachers':res})



def get_teachers_v1(req):
    #加载模板
    template=loader.get_template('templates/teach04/teachers.html')
    print(template)
    print(dir(template))
    #拿数据
    res=Teacher.objects.all()
    template_str=template.render({{'teacher':res}})
    #将渲染得到的HTML返回到请求
    return HttpResponse(template_str+" 已经完成")

    1-点语法:通过变量访问属性或方法。

<h1>教师工资如下(访问某个变量的值):</h1>
    <ul>
       {% for i in teachers  %}
           {% if i.id == 2 %}
            <li style="color: #00A000">{{i.name}}的工资是{{ i.salary }}</li>
           {% else %}
           <li style="color: #0000aa"></li>
            <p>{{ i.get_base_msg }}</p>
           {% endif %}
       {% endfor %}
    </ul>

        2-通过下标访问数组内的元素:

<h1>这里是第几个的获取(下标访问数组内的元素)</h1>
    <p>{{teachers.0.get_base_msg}}</p>
<hr>
    <ul>
        {% for i in teachers %}
            <li>第{{ forloop.counter }}条数据:{{ i.get_base_msg }}</li>
{#                {% if forloop.counter == 1%}#}
                {% if forloop.first %}
                    <li style="color: #00A000">第{{ forloop.counter }}数据</li>
                {% else %}
                    <li style="color: #cc0000">第{{ forloop.counter }}数据</li>
                {% endif %}
        {% endfor %}
    </ul>
<hr>

           3-if 条件判断

格式:


{% if  表达式 %}
	        语句
	{% endif  %}


	{%  if 表达式 %}
	         语句
	{% else  %}
	         语句
	{% endif %}
	{% if 表达式 %}
                      语句	
 	{% elif 表达式 %}
                      语句
	{% endif %}

举例参考上一条,已经有用到。

        4-乘除

格式:{%withratio 数  分母  分子 %}

        5-整除

格式:{%if  你的数字 | divisibleby:要整除几%}

        6-转日期

格式:{{  dateVal | date:'y-m-d' }}

  <ul>
       {% for i in teachers  %}
      {#  乘除withratio#}
          {% widthratio i.age 1 3 %}
      {#  整除  有毒#}
       {% if 16|divisibleby:2 %}
        <li style="color:red">老师是{{ i.name }}</li>
        {% endif %}
       {#  判断是否相等#}
       {# 字母大小写/join#}
           {{ i.name |upper }}
           {{ i.name|join:3}}
       {# 转日期#}

           <br>
       {% endfor %}
         <hr>

因为自己的数据表中未涉及到时间日期的相关数据,所以咸鱼婷也做不了详细举例啦,想要了解到同志们可以直接去访问官方文档。

        7-注释

单行不可见使用: {#你想注释的内容#}
   多行不可见使用:

{%comment%}
    你
    的
    注
    释
{%endcomment%}

       8-获取循环次数:

 {{ forloop.counter }} 表示当前是第几次循环,从1数数
{{ forloop.counter0}}表示当前是第几次循环,从0数数
{{ forloop.revcounter}}表示当前是第几次循环,倒着数数,到1停
{{ forloop.revcounter0}}表示当前第几次循环,倒着数,到0停
{{ forloop.first }} 是否是第一个  布尔值
{{ forloop.last }} 是否是最后一个 布尔值

    9-判断是否等于

格式:{%ifequal teachers.1.id 2%}
                等于
           {%else%}
                不等于

            {%endifequal%}

    10-部分操作

    add:{{变量 |add:5}}

    lower:{{变量 | lower}}    upper:大写,一样的用法

    11-反向解析(利用相应的命名空间和URL名字来找到对应的逻辑处理)

做法:1-在工程的urls.py中,加入namespace

    url(r'^teach04/', include('teach04.urls',namespace='teach04')),
     -

          2-在项目的urls.py中,加入name参数:

 url(r"^stu$", get_stu,name="stu"),

           3-前端

  

 {%url‘teach04:stu'%}

           4-后端

def index(req):
    	return HttpResponseRedirect(reverse('python1803:czn'))
    	解释:HttpResponseRedirect 是重定向 
    		 reverse('
                    teach04:stu'
                )





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值