1. 程式人生 > >Django 再次學習筆記整理

Django 再次學習筆記整理

() red lse per else cut 標簽 字典 模板語言

url 路由系統

urlpatterns = [
	# path(‘admin/‘, admin.site.urls),
	path(‘index/‘, views.index),
	re_path(‘^edit/(\w+)/$‘,views.edit1),		# 加上 $  
	re_path(‘^edit/(\w+).html$‘,views.edit2),	# 如果前面不加結尾符,則不能匹配此url
	re_path(‘^edit/(?P<a2>\w+)/(?P<a1>\w+).html$‘,views.edit3), 
	# 按參數名傳參    # def edit3(request,*args,**kwargs):
	# 不要將(\w+)與(?P<a2>\w+)混用
	
	
	path(‘index2/‘, views.index2,name=‘n2‘),# 給url命名;在函數中通過別名反找到url
		from django.urls import reverse
		def index2(request):
			v = reverse(‘n2‘)		
			return HttpResponse(v)	# 通過別名反找到url,反生成url
		
	re_path(‘index3/(\w+)‘, views.index3,name=‘n3‘),	# 可隨意生成(\w+)位置的值
		def index3(request,*args):
			v = reverse(‘n3‘,args=(123,))    
			# 請求url:index3/3        生成url:index3/123
			# 有多少(\w+),args=(,)就寫多少個參數
			return HttpResponse(v)
	
	re_path(‘^index4/(?P<a2>\w+)/(?P<a1>\w+).html$‘, views.index4,name=‘n4‘),# 可隨意生成(?P<a2>\w+)位置的值
		def index4(request,**kwargs):
			v = reverse(‘n4‘,kwargs={‘a2‘:666,‘a1‘:777))        # 
			# 請求url:index4/4/3        生成url:/index4/666/777.html
			# 有多少(?P<a2>\w+),kwargs={,}就寫多少個鍵值對
			return HttpResponse(v)
	
	re_path(‘^‘, default)
		# 此規則放最後
		# 什麽都不輸或者輸錯了,將會被匹配    # def default(request):return HttpResponse(‘url 錯誤‘)
]

若是給url命名,在templates模板中可以直接使用名字{% url ‘m1‘ %}
	path(‘index10/‘, views.index10,name=‘m1‘),
		<form method="post" action="{% url ‘m1‘ %}">        # -><form method="post" action="/index10/">
	re_path(‘index10/(\w+)/‘, views.index10,name=‘m2‘),
		<form method="post" action="{% url ‘m3‘ ‘abc‘ %}">    # "補位"

路由分發:
	urls.py分配url到app
	from django.urls import path,re_path,include
	urlpatterns = [
		path(‘app01/‘, include(‘app01.urls‘)),    
			# 只匹配開頭,然後交與app01中的urls繼續匹配
			# 請求url為 http://127.0.0.1:8000/app01/index/        
			# -> 先匹配到app01 -> app01下的urls中匹配index
	]

	在app01.urls.py文件下匹配url
	from django.urls import path,re_path
	from app01 import views

	urlpatterns = [
		path(‘index/‘, views.index),
	]

from django.urls import path,re_path,
re_path(r‘^ip/‘, ([
					 re_path(‘^$‘, daili.display),
					 re_path(‘^page_(\d)/$‘, daili.display),	# *args
					 re_path(‘^page_(?P<page>\d)/$‘, daili.display)	# **kwargs
				 ], None, None)),

CBV:
	path(‘login.html‘,views.Login.as_view()),

	from django.views import View
	class Login(View):    
		def get(self,request):
			return HttpResponse(‘Login.get‘)

模板語言

# 訪問對象的屬性,可以直接用.點出需要的值
{{ obj.id }}
# 訪問字典用dict.key
{{ dict.key }}
# 訪問元組用tuple.0 索引
{{ tuple.1 }}

{% url %} 引用路由配置的地址,url的反向解析;
	{% url ‘name‘ %}
	
{% csrf_token %}
	# 防止跨站攻擊,一般只在表單POST提交的時候添加;
	# 其實,這裏會生成一個input標簽,將csrf的數據的信息以鍵值對的方式提交後臺;

# 循環
{% for item in item_list %}  
	<a>{{ item }}</a>  
  {{ forloop.counter }}
  {{ forloop.first }}
  {{ forloop.last }}
{% endfor %}

# if else
{% if ordered_warranty %}
	。。。
{% else %}
	...
{% endif %}

母板:{% block title %}{% endblock %}
子板:{% extends "base.html" %}
   {% block title %} 在此嵌入內容 {% endblock %}
幫助方法:
	# 字母大寫
	{{ temp|upper}}
	# 在temp的基礎上加3
	{{ temp|add:3 }}
	# 按空格切割
	{{ temp|cut:‘‘ }}
	# 以固定格式輸出時間
	{{ temp|date:"Y-m-d H:i:s"}}
	# 內容如果為空,默認輸出引號後面的內容
	{{ temp|default:‘空的‘}}
	# 將html的字符串轉為html標簽顯示出來
	{{ temp|safe }}

自定義模板語言函數
	創建templatetags目錄,在其下創建xxx.py文件
	使用特殊方法要先導入:{% load xx %}
	xxx.py
	from django import template
	register = template.Library()

	@register.filter                    # 只能有2個參數
	def my_func(value,arg):
		return value+arg
			{{ name|my_func:"666"}}    # 冒號後不能有空格
			{%if name |my_func%}
			〈h3〉真〈/h3〉
			{%else%}
			〈h3〉假</h3〉
			{%endif%}
		
	#register.simple_tag                # 可傳多個參數
	def my_func(value,a1,a2,a3):
		return value+a1+a2+a3
			{% my_func "a11" "a222" "a333"  %}

小組件,可在頁面多次加載,可不用{% load xx %}導入
	{% include ‘pub.html‘ %}
	pub.html
		<div>
			<h3>特別漂亮的組件</h3>
			<div class="title">標題:{{ name}}</div>
			<div class="content">內容:{{ name}}</div>
		</div>
	index.html
		<body>{% include ‘pub.html‘ %}

Django 再次學習筆記整理