django url配置篇_django {% url 'users:user_info' %}-程序员宅基地

技术标签: django  

本文的view基于cbv模式,django为1.11,1.8到1.11下面的大部分内容使用。

django解析url过程。

  1. 一般情况下,django从setting中找到ROOT_URLCONF ,使用这个URLconf的作为根模块。
  2. 加载这个模块,找到urlpatterns变量,这个变量必须是django.conf.urls.url对象的一个列表。
  3. 遍历整个列表,通过正则表达式匹配到第一个view函数或基于类的view。
  4. 这个view会得到三种类型的参数(最多):
    request实例,通过正则表达式传过来的参数,额外的参数
  5. 如果没有匹配到,那么会调用相关的error-handling view.

简单的URLconf

from django.conf.urls import url
from articles.view import ArticleListView

urlpatterns = [
    url('^articles/$', ArticleListView.as_view()),
    ]

带参数的URLconf

 1. 位置参数(不推荐使用)

from django.conf.urls import url
from articles.view import ArticleListView

urlpatterns = [
    # url表示某年某月的文章列表
    url('^articles/([0-9]{4})/([0-9]{2})$', ArticleListView.as_view()),
    ]

url如articles/2018/01/,这样相当于调用这个类(cbv)下面的get(request, ‘2018’, ‘01’)

 2. 关键参数(推荐)

from django.conf.urls import url
from articles.view import ArticleListView

urlpatterns = [
    # url表示某年某月的文章列表
    url('^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})$', ArticleListView.as_view()),
    ]

同样的例子,这样写法表示调用get(request, year=’2018’, month=’01’)
需要注意的是,使用关键参数,在定义相关方法,如get,post等,参数的名字一定要匹配。

 3. 嵌套参数

urlpatterns = [
    url('^articles/(page-(\d+)/)?$', ArticleListView.as_view()), #bad
    url('^articles/(?:page-(?P<page_number>\d+)/)?$', ArticleListView.as_view()), #good
]

上述2个url匹配表达同样的意思,获取到当前页的page作为参数传递给view,url要么只是articles/,要么就是articles/page-2/(例子),当第一个会传递2个参数,page-2以及2,很明显page-2这个参数我们并不需要,而第二个只会传递2这个参数,很明显,第二个优于第一个,正则(?:)表示只用于匹配但不把值保留。

  1. 额外参数
urlpatterns = [
    url(r'^articles/(?P<year>[0-9]{4})/$', ArticleListView.as_view(), {
   'foo': 'bar'}),
]

如 /articles/2018/,相当于调用了类下面的get(request, year=’2005’, foo=’bar’)

include

试想一下,某个app下定义了十几个view,如果全部写到同一个urlpatterns下,这当然可以,但管理起来就会很混乱,这个时候,include就发挥作用了。

# 全部写在根URLconf下
from django.conf.urls import include, url
...
extra_patterns = [
    url(r'^info/$', UserInfoView.as_view()),
    url(r'^fav/$', UserFavView.as_view()),
]

urlpatterns = [
    # 注意不要写末尾符号$
    url(r'^user/', include(extra_patterns)),
]

更优的应该是在app下建立一个urls.py文件,专门存放这个app的相关url

# urls.py

urlpatterns = [
    # 注意不要写末尾符号$
    url(r'^user/', include(users.urls)),
]

# users/urls.py
urlpatterns = [
    url(r'^info/$', UserInfoView.as_view()),
    url(r'^fav/$', UserFavView.as_view()),
]

如果是在根URLconf传递的参数,那么在子的urlpatterns中,每一个view都会去接受这个参数

反解url

这部分内容应该是整个URLconf最重要的内容了,试想一下,每一个url都相对比较长,而且又难记,我们肯定希望有一个方法能够解决这个问题,那么就是name了,给每一个url进行命名! 通过这个name来反解出url。

urlpatterns = [
    url(r'^article/detail/(?P<ariticle_id>[0-9]{4})/$', ArticleListView.as_view(), name='article_detail'),
]

这样子,我们可以使用article_detail来代表这个url了,在template中,我们可以使用url这个tag来表示!

<ul>
    {% for ariticle in ariticles %}
        <li>
        {# 注意参数的传递}
             <a href="{% url 'article_detail' ariticle.id %}">{
    { ariticle.name }} </a>
        </li>
    {% endfor %}
</ul>

反解url在进行重定向的时候也经常使用,例如在成功登录后重定向到主页

from django.urls import reverse
from django.http import HttpResponseRedirect
class LoginView(View):
    def post(request):
    # ...
    return HttpResponseRedirect(reverse('index'))

reverse 函数还可以传递参数:

reverse('article_detail',  args=(ariticle_id,))

反解namespace urls

现在存在一个问题,就是如果我们使用了include,那么我们要怎么做到name与url的一对一呢,namespace就是来解决这个问题的!

# urls.py

urlpatterns = [
    # 注意不要写末尾符号$
    url(r'^user/', include(users.urls, namespace=users)),
]

# users/urls.py
urlpatterns = [
    url(r'^info/$', UserInfoView.as_view(), name='info'),
    url(r'^fav/$', UserFavView.as_view(), name='fav'),
]

还有另外一种写法!在子URLconf设置app_name属性

# urls.py

urlpatterns = [
    # 注意不要写末尾符号$
    url(r'^user/', include(users.urls)),
]

# users/urls.py
app_name = 'users'
urlpatterns = [
    url(r'^info/$', UserInfoView.as_view(), name='info'),
    url(r'^fav/$', UserFavView.as_view(), name='fav'),
]

那么, 怎么去调用他们呢!格式:’namespace:name’

reverse('users:info')

template中:

{% url 'users:info' %}

本篇内容还缺少error-handling view, 等博主研究完了再更新~

总结

本篇重点应该是namespace以及name的使用,还有参数的传递!

如果有什么错误,欢迎各位的指出~ 感谢!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/l_vip/article/details/79212594

智能推荐

VBA实现EXCEL转DBC_dim i, j as integer dim row as integer dim filepat-程序员宅基地

文章浏览阅读1.9k次,点赞11次,收藏40次。利用VBA实现对EXCEL转成DBC文件EXCEL的格式如下:VBA代码:Sub exceltodbc() Dim i, j As Integer Dim row As Integer Dim filepath, GenMsgCycleTime, CM, VAL As String Dim MsgName, MsgId, MsgCyc..._dim i, j as integer dim row as integer dim filepath, genmsgcycletime, cm, va

[高通平台]9008模式下如何读取MSMID和serial_number_qsaharaserver.exe-程序员宅基地

文章浏览阅读1.6k次。1、电脑上安装QPST,默认路径为:C:\Program Files (x86)\Qualcomm\QPST\bin2、打开Windows的命令行窗口,开始->cmd->回车3、在命令行输入:cd C:\Program Files (x86)\Qualcomm\QPST\bin4、操作手机进入9008模式,(adb reboot edl,或者通过短接,或者空板直接连接USB)5、在设备管理器中确认9008对应的端口号比如566、在命令行输入命令QSaharaServer.ex_qsaharaserver.exe

Chrome 浏览器架构_谷歌浏览器的页面结构-程序员宅基地

文章浏览阅读729次。背景这篇文章被收录在我的前端技术系列文章中浏览器工作原理栏目中,做为这个栏目的第一篇文章,先从页面是如何在浏览器中被显示出来这一最常见的问题做为开始,整体介绍浏览器的工作原理。这篇文章取材于Mariko Kosaka在 2018 年 9 月发表在 Chrome 开发者文档中的Inside look at modern web browser系列文章,同时结合我自己的理解。如果你对浏览器如何将代码转化成页面,这正适合于你。CPU 与 GPUCPU 和 GPU 作为计算机中最重要的两个计算单元直接决定了计算性能_谷歌浏览器的页面结构

常见的网站登录验证码种类及其解决办法_登录校验码 类型-程序员宅基地

文章浏览阅读3.6k次。在爬虫开发时,大家经常会遇到验证码识别,在网站中加入验证码的目的是加强用户安全性和提高反爬虫机制,有效防止对某一特定注册用户用特定程序暴力破解的方式不断地进行登录尝试。在此为大家介绍一下验证码的种类。【字符验证码】:在图片上随机产生数字、英文字母或汉字,一般有4位或者6位验证码字符。通过添加干扰线、添加噪点以及增加字符的黏连程度和旋转角度来增加机器识别的难度。但这种传统的验证码随着OCR技术的..._登录校验码 类型

解决Vue项目打包后打开index.html页面显示空白以及图片路径错误的问题-程序员宅基地

文章浏览阅读2.4k次。Vue项目运行npm run build后会生成一个dist文件夹,我们一般都是把这个文件夹部署到服务器上。dist文件夹里边有一个static文件和一个index.html页面,这个index就是最后单页面的最终文件。问题一:我在打包完成后,打开index.html文件发现地址并没有携带路由。这样的话页面就是空白了,因为没有组件被添加到页面中。打开F12会看到一堆的红色failed请求。打...

未将对象引用到对象的实例_未将对象引用设置到对象的实例-程序员宅基地

文章浏览阅读4.3k次。未将对象引用到对象的实例原因主要有以下几个:1、ViewState对象为Null。2、DateSet为空。3、sql语句或Datebase的原因导致DataReader空。4、声明字符串变量时未赋空值就应用变量。5、未用new初始化对象。6、Session对象为空。7、对控件赋文本值时,值不存在。8、使用Request.QueryString()时,所获取的对象不存在,或在值为..._未将对象引用设置到对象的实例

随便推点

某赛通电子文档安全管理系统 RCE(QVD-2023-19262)-程序员宅基地

某赛通电子文档安全管理系统 RCE(QVD-2023-19262)

【2023-03-19】米哈游春招笔试三道编程题&题解_米哈游笔试题目-程序员宅基地

文章浏览阅读1.3k次。【2023-03-19】米哈游春招笔试三道编程题&题解_米哈游笔试题目

java输入坐标_用java语言编写输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离....-程序员宅基地

文章浏览阅读5.7k次,点赞4次,收藏11次。共回答了24个问题采纳率:95.8%import java.util.Scanner;public class TestObject {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);Syst..._java输入两点坐标(x1,y1),(x2,y2),计算并输出两点间的距离。

Share Extension 屏蔽掉自己的app_ios 系统分享组件屏蔽应用本身-程序员宅基地

文章浏览阅读324次。原文:Hiding Your Action and Share Extensions In Your Own Apps<key>NSExtensionAttributes</key><dict> <key>NSExtensionActivationRule</key> <string> SUBQUERY ( extensionItems, $extensionItem, _ios 系统分享组件屏蔽应用本身

html+css实现钟表特效_闹钟uihtml+css-程序员宅基地

文章浏览阅读510次。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Doc_闹钟uihtml+css

android studio 添加控件的三种方式_android studio在背景上添加控件-程序员宅基地

文章浏览阅读7.6k次。写在这里以作笔记。第一种:布局文件中添加布局文件中:&lt;android.support.percent.PercentFrameLayout android:layout_width="match_parent" android:layout_height="wrap_content"&gt; &lt;EditText ..._android studio在背景上添加控件