Django开发基础

1、path 和 url 、re_path区别:

    path:调用的是django的第三方模块或框架
    url:调用的是调用的自定义模块
    re_path:是用正则匹配,路由分发

2、render和redirect区别:

    render:它是渲染变量到模板里的,而redirect是HTTP中的一个跳转函数,一般是302状态;
    redirect它里面只需要传一个url
    如果是redirect,那么不仅内容返回的是里面的模板内容,地址栏中的地址也会改变为模板内容的路径。
    如果是render,那么内容会返回的是模板内容,地址栏中的地址不会改变,还是请求时候的。
    如果要想浏览器地址也改变,也render。只有先redirect 然后再render
    也就是说,在浏览器中先redirect到一个url路径,然后在url的那个路径指向的views.py中的方法中render
    redirect要传递参数的话,有一种方法,是通过session保存

3、django 前端页面局部刷新:

<script>
    $(function () {
        $('#jsStayBtn').on('click', function () {
            $.ajax({
                cache: false,
                type: "POST",
                url: "{% url "org:add_ask" %}",
                data: $('#jsStayForm').serialize(),
                async: true,
                success: function (data) {
                     if (data.status == 'success') {
                        $('#jsStayForm')[0].reset();
                        alert("提交成功")
                    } else if (data.status == 'fail') {
                        $('#jsCompanyTips').html(data.msg)
                    }
                },
            });
        });
    })
</script>

4、通过HttpResponseRedirect 和 reverse实现重定向

用django开发web应用, 经常会遇到从一个旧的url转向一个新的url,也就是重定向。

HttpResponseRedirect:构造函数的第一个参数是必要的 — 用来重定向的地址。这些能够是完全特定的URL地址(比如,’http://www.hello.com/search/‘),或者是一个不包含域名的绝对路径地址(例如, ‘/search/’)。

from django.http import HttpResponseRedirect
from django.views import View

class LoginView(View):
def post(self, request):
    ...
    return HttpResponseRedirect("/index/")

还可以通过reverse()对url的name进行解析:

url.py

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url(r'^index/$', views.myview, name='index'),

myapp/views.py

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def myview(request):
    ...
    return HttpResponseRedirect(reverse('index'))

而如果url中包含参数,如下类型的url:

url(r'^blog/(?P<blog_id>\d+)/$', BlogDetailView.as_view(), name='blog_id')

如果我们还采用上述方式实现重定向,则会提示缺少一个参数:blog_id。此时需要在reverse()中添加参数:

blog_id = blog.id   #获取到博客的id号
return HttpResponseRedirect(reverse('index', args=(blog_id)))

如果包含多个字段,可以采用如下形式:

url(r'^blog/(?P<blog_id>\d+)/(?P<user_id>\d+)、$', BlogDetailView.as_view(), name='blog_id')

return HttpResponseRedirect(reverse('index', kwargs={'blog_id': blog_id, 'user_id': user_id}))

5、Django(filter过滤器)

{{ obj|upper }}                 #将obj大写                     hello  -> HELLO
{{ obj|add:"2" }}               #在obj后边加上"2"               hello  -> hello2 
{{ obj|cut:' ' }}               #将obj中间的空格减去             hel lo  wo r ld   ->helloworld
{{ obj|date:'Y-m-d' }}          #将obj以Y-m-d形式显示            datetime.datetime.now()  ->2018-06-05
{{ obj|default:'空的' }}         #如果obj只是定义没有赋值,那么默认给其赋值为"空的"     ""  ->空的
{{ obj|safe }}                  #obj="<a href='#'>跳转</a>",如果不加safe,渲染的就只是一个字符串,如果加上,渲染的就是一个连接 

{% autoescape off %}             #同上safe作用
    {{ obj }}
{% endautoescape %}
{{ obj|filesizeformat }}  
{{ obj|urlencode }}              将obj编码              http://www.baidu.com/ ->http%3A//www.baidu.com

6、Django模板标签{% for %}用法(含forloop用法)

在django模板标签中,{% for %} 标签用于迭代序列中的各个元素。
与 Python 的 for 语句类似,语法是 for X in Y ,其中 Y 是要迭代的序列, X 是单次循环中使用的变量。每次迭 代时,模板系统会渲染 {% for %} 和 {% endfor %} 之间的内容。

1. 可以使用下述模板显示 athlete_list 变量中的运动员:
<ul>
    {% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

2. 加入 reversed 标签,反向迭代列表
{% for athlete in athlete_list reversed %} 
… 
{% endfor %}

3. 对二元组解包
{% for x, y in points %}
    <p>There is a point at {{ x }},{{ y }}</p>
{% endfor %}

4. 字典解包
{% for key, value in data.items %}
    {{ key }}: {{ value }}
{% endfor %}

5. 判断列表是否为空,为空就显示特定内容
第一种使用{% if %}标签
{% if athlete_list %}
    {% for athlete in athlete_list %}
        <p>{{ athlete.name }}</p>
    {% endfor %}
{% else %}
    <p>There are no athletes. Only computer programmers.</p>
{% endif %}

第二种使用{% empty %}标签
{% for athlete in athlete_list %}
    <p>{{ athlete.name }}</p>
{% empty %}
    <p>There are no athletes. Only computer programmers.</p>
{% endfor %}

5. {% for %}标签内部模板变量forloop
在{% for %}循环内部,可以访问一个名为forloop的模板变量。这个变量有若干属性,通过它们可以获知循环进程的一些信息。

5.1 forloop.counter
forloop.counter 的值是一个整数,表示循环的次数。这个属性的值从 1 开始,因此第一次循环时,forloop.counter 等于 1 。

{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

5.2 forloop.counter0
forloop.counter0 与 forloop.counter 类似,不过是从零开始的。第一次循环时,其值为 0 。

5.3 forloop.revcounter
forloop.revcounter的值是一个整数,表示循环中剩余的元素数量。第一次循环时, forloop.revcounter 的值是序列中要遍历的元素总数。最后一次循环时, forloop.revcounter的值为 1 。

5.4 forloop.revcounter0
forloop.revcounter0 与 forloop.revcounter类似,不过索引是基于零的。第一次循环时, forloop.revcounter0的值是序列中元素数量减去一。最后一次循环时, forloop.revcounter0 的值为 0 。

5.5 forloop.first
forloop.first 是个布尔值,第一次循环时为 True 。需要特殊处理第一个元素时很方便:
{% for object in objects %}
    {% if forloop.first %}
        <li class="first">
    {% else %}
        <li>
    {% endif %}
        {{ object }}
    </li>
{% endfor %}

5.6 forloop.last
forloop.last是个布尔值,最后一次循环时为True 。经常用它在一组链接之间放置管道符号:

{% for link in links %}
     {{ link }}{% if not forloop.last %} | {% endif %}
{% endfor %}
上述模板代码的输出可能是:

Link1 | Link2 | Link3 | Link4
此外,还经常用它在一组单词之间放置逗号:
<p>Favorite places:</p>
{% for p in places %}
    {{ p }}{% if not forloop.last %}, {% endif %}
{% endfor %}

5.7 forloop.parentloop
在嵌套的循环中, forloop.parentloop引用父级循环的 forloop 对象。下面举个栗子:
{% for country in countries %}
    <table>
  {% for city in country.city_list %}
    <tr>
    <td>Country #{{ forloop.parentloop.counter }}</td>
    <td>City #{{ forloop.counter }}</td>
    <td>{{ city }}</td>
    </tr>
  {% endfor %}
    </table>
{% endfor %}
小贴士😊

forloop 变量只在循环内部可用。模板解析器遇到 {% endfor %} 时, forloop 随之消失。
上下文和 forloop 变量
在 {% for %} 块中,现有变量会让位,防止覆盖 forloop 变量。Django 把移动的上下文放到
forloop.parentloop 中。通常,你无须担心,但是如果有名为 forloop 的模板变量(不建议这
么做),在 {% for %} 块中会重命名为 forloop.parentloop 。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容