python-djangoフロントエンドでデータを転送する3つのフォーマット_CBVソース分析_djangoテンプレート構文
django
1.CBVソース分析
2.前後端交互符号化方式
3.djangoテンプレート構文
1.djangoテンプレートの使い方
views.py
time.html
2.テンプレート構文の変数
DTL: Django Template Language
Djangoテンプレートにおける複雑なデータ構造の遍歴の鍵は句点文字であり,構文:{変数名}}
views.py
index.html
3.テンプレート構文の深さクエリー句点
views.py
index.html
4.テンプレートフィルタ
default,length,filesizeformat,date,slice,truncatechars,safe
index.html
5.テンプレートラベル
for,for … empty,if,with,csrf_token
タグ構文:{%tag%}
ラベルは変数より複雑です.
一部は出力にテキストを作成し、一部はループまたは論理によってプロセスを制御し、一部はその後の変数が使用する追加情報をテンプレートにロードします.一部のラベルには、開始ラベルと終了ラベル(例えば、{%tag%}...ラベル内容...{%endtag%})が必要です.
forラベル
各要素を巡回:
辞書を1つ巡ります.
注:サイクル番号は{forloop}で表示できます
for … empty
forラベルには、与えられたグループが空であるか、見つからない場合に操作できるように、オプションの{%empty%}従文が付いています.
ifラベル
{%if%}は変数を評価し、その値が「True」(存在、空ではなくbooleanタイプのfalse値ではない)の場合、対応するコンテンツブロックが出力されます.
if文はand,or,=,>,=,in,not in,is,is not判断をサポートする.
withラベル
単純な名前で複雑な変数をキャッシュする
データベースへのアクセスなど、「高価」な方法を何度も使用する必要がある場合に便利です.
csrf_tokenラベル
{% csrf_token%}
このラベルは、サイト間で偽造保護を要求するために使用されます.
views.py
index.html
1.CBVソース分析
# : bug
# urls.py
url(r'^login/',views.MyLogin.as_view())
'''
CBV FBV
ps: /
as_view() @classmethod
@classonlymethod
def as_view(cls, **initkwargs):
...
return view
'''
# as_view
@classonlymethod
def as_view(cls, **initkwargs):
"""
cls
Main entry point for a request-response process.
"""
def view(request, *args, **kwargs):
self = cls(**initkwargs) # cls
# self = MyLogin(**initkwargs)
return self.dispatch(request, *args, **kwargs)
"""
...
: self self
"""
return view
# CBV
1. , path('index/', views.Index.as_view()),
views.Index.as_view()(request)
2. as_view() view(request)
3. view(request) => dispatch(request)
4. dispatch , (get,post)=> def get def post
# views.py
class Index(View):
#
# http_method_names = ['post', 'get']
def dispatch(self, request, *args, **kwargs):
# dispatch
#
#
# res=super().dispatch(request, *args, **kwargs)
# #
# return res
# , get
return self.get(request, *args, **kwargs)
# dispatch , ,
def get(self, request, *args, **kwargs):
print(request.data)
return HttpResponse('cbv get ')
def post(self, request, *args, **kwargs):
return HttpResponse('cbv post ')
2.前後端交互符号化方式
1. urlencoded => (form ) request.POST
2. form-data => request.POST request.FILES
3. json => json request.body
def index(request):
# urlencoded
body :name=lqz&age=18
# print(request.POST)
# form-data
body : , ,
:name=lqz&age=18
---asdfasdfasdfgasgasgd---
:( )
#
# print(request.POST)
#
# print(request.FILES)
# json
body
{
"name": "lqz",
"age": 18
}
#
print(request.POST)
# ( )
print(request.body)
return HttpResponse('ok')
3.djangoテンプレート構文
1.djangoテンプレートの使い方
# :
:{
{
}}
1
2
:{
% % }
views.py
from django.template import Template,Context
def index(request):
# ,
now = datetime.datetime.now()
return render(request,'time.html',context={
'current_date':str(now),'title':'lqzNB'})
#
now=datetime.datetime.now()
# t = Template(' :{
{current_date}}')
from day65 import settings
import os
path=os.path.join(settings.BASE_DIR,'templates','time.html')
print(path)
ss=open(path,'r',encoding='utf-8').read()
t=Template(ss)
# t=get_template('current_datetime.html')
c=Context({
'current_date':str(now),'title':'lqzNB'})
html=t.render(c) # html
# render(request,'home.html',context={'current_date':str(now)})
return HttpResponse(html)
time.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{
{ title }}title>
head>
<body>
:<h1>{
{ current_date }}h1>
body>
html>
2.テンプレート構文の変数
DTL: Django Template Language
Djangoテンプレートにおける複雑なデータ構造の遍歴の鍵は句点文字であり,構文:{変数名}}
views.py
{
{
python }}
def index(request):
num = 10
ss = 'lqz is handsome'
b = False
ll = [1, 2, 43]
dic = {
'name': 'lqz', 'age': 18}
def test():
print(' test')
return 'test --- '
class Person():
def __init__(self, name):
self.name = name
def print_name(self):
return self.name
def __str__(self):
return self.name
p=Person('lqz')
# return render(request, 'index.html',{'num':num,'ss':ss,'b':b})
# locals() , context
return render(request, 'index.html',locals())
index.html
# index.html
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{
{ss}}title>
head>
<body>
<h1> h1>
<p> :{
{ num }}p>
<p> :{
{ ss }}p>
<p> :{
{ b }}p>
<p> :{
{ ll }}p>
<p> :{
{ dic }}p>
<p> :{
{ test }}p>
<p> :{
{ p }}p>
body>
html>
3.テンプレート構文の深さクエリー句点
views.py
def index(request):
num = 10
ss = 'lqz is handsome'
b = False
ll = [1, 2, 43, {
'name': 'egon'}]
dic = {
'name': 'lqz', 'age': 18}
def test():
print(' test')
return 'test --- '
class Person():
def __init__(self, name):
self.name = name
def print_name(self):
return self.name
def __str__(self):
return self.name
p = Person('lqz')
link1 = ' を け'
link2 = mark_safe(link1)
input_1=' :
'
input_2=mark_safe(input_1)
script_1='''
alert(' ')
'''
script_2 =mark_safe(script_1)
return render(request, 'index.html', locals())
index.html
<h2> h2>
<p> :{
{ ll.0 }}p>
<p> name :{
{ dic.name }}p>
<p> name :{
{ ll.2.name }}p>
<p> , :{
{ test }}p>
<p> ? p>
<p> : {
{ p.print_name }}p>
<p> : {
{ p.name }}p>
<hr>
<a href="https://www.baidu.com"> a>
<p>a : {
{ link1 }}p>
<p>a , a : {
{ link2 }}p>
<p> :<input type="text" name="name">p>
<p>input :{
{ input_1 }}p>
<p>input , :{
{ input_2 }}p>
<p>js :{
{ script_1 }}p>
{
{ script_2 }}
#
from django.utils.safestring import mark_safe
link1 = '<a href="https://www.baidu.com"> <a>'
link2 = mark_safe(link1)
{link1|safe}
4.テンプレートフィルタ
default,length,filesizeformat,date,slice,truncatechars,safe
index.html
1. {
{ 1| : 2 }}
2. , {
{ 'lqz is'|slice: '2:3' }}
<h1> h1>
<p> default:{
{ num|default:' ' }}p>
<p> length:{
{ ll|length }}p>
<p> length:{
{ dic|length }}p>
<p> length:{
{ 'das'|length }}p>
{# #}
#
<p> filesizeformat:{
{ num|filesizeformat }}p>
# lqz is handsome
<p> slice:{
{ ss|slice:"7:11" }}p>
# 0,1,2, ..., 3
<p> truncatechars:{
{ ss|truncatechars:'30' }}p>
<p>truncatewords:{
{ ss|truncatewords:'2' }}p>
#
<p> date:{
{ ctime|date:'Y m d -------H i s ' }}p>
<p> safe:{
{ link1|safe }}p>
5.テンプレートラベル
for,for … empty,if,with,csrf_token
タグ構文:{%tag%}
ラベルは変数より複雑です.
一部は出力にテキストを作成し、一部はループまたは論理によってプロセスを制御し、一部はその後の変数が使用する追加情報をテンプレートにロードします.一部のラベルには、開始ラベルと終了ラベル(例えば、{%tag%}...ラベル内容...{%endtag%})が必要です.
forラベル
各要素を巡回:
{% for person in person_list %}
<p>{
{ person.name }}p>
{% endfor %}
{% for obj in list reversed %}
を使用してループを逆方向に完了できます辞書を1つ巡ります.
{% for key,val in dic.items %}
<p>{
{ key }}:{
{ val }}p>
{% endfor %}
注:サイクル番号は{forloop}で表示できます
forloop.counter
The current iteration of the loop (1-indexed) ( 1 )
forloop.counter0
The current iteration of the loop (0-indexed) ( 0 )
forloop.revcounter
The number of iterations from the end of the loop (1-indexed) ( 1 )
forloop.revcounter0
The number of iterations from the end of the loop (0-indexed) ( 0 )
forloop.first
True if this is the first time through the loop ( )
forloop.last
True if this is the last time through the loop ( )
forloop.parentloop
for … empty
forラベルには、与えられたグループが空であるか、見つからない場合に操作できるように、オプションの{%empty%}従文が付いています.
{% for person in person_list %}
<p>{
{ person.name }}p>
{% empty %}
<p>sorry,no person herep>
{% endfor %}
ifラベル
{%if%}は変数を評価し、その値が「True」(存在、空ではなくbooleanタイプのfalse値ではない)の場合、対応するコンテンツブロックが出力されます.
{% if num > 100 or num < 0 %}
<p> p>
{% elif num > 80 and num < 100 %}
<p> p>
{% else %}
<p> p>
{% endif %}
if文はand,or,=,>,=,in,not in,is,is not判断をサポートする.
withラベル
単純な名前で複雑な変数をキャッシュする
データベースへのアクセスなど、「高価」な方法を何度も使用する必要がある場合に便利です.
{% with total=business.employees.count %}
{
{ total }} employee{
{ total|pluralize }}
{% endwith %}
csrf_tokenラベル
{% csrf_token%}
このラベルは、サイト間で偽造保護を要求するために使用されます.
views.py
# views.py
def index(request):
ll=['lqz','egon','zs','ls','ww']
# ll=[]
dic={
'name':'lqz','age':19}
count=1
lqzisnbplus='lqz'
# b=False
b=True
user_list=[{
'name':'lqz','age':19},{
'name':'egon','age':18},{
'name':' ','age':22},{
'name':' ','age':99},{
'name':'asdfasdf','age':18},{
'name':' n','age':18}]
return render(request, 'index.html', locals())
index.html
<h1> h1>
<h2>for h2>
{% for l in ll %}
{# <p>{
{ l }}p> #}
<p><a href="http://127.0.0.1:8080/{
{ l }}">{
{ l }}a>p>
{% endfor %}
<hr>
{% for k,v in dic.items %}
<p>key :{
{ k }},value {
{ v }}p>
{% endfor %}
<table border="1">
<tr>
<td>id td>
<td> td>
<td> td>
tr>
{% for dic in user_list %}
<tr>
<td>{
{ forloop.counter }}td>
<td>{
{ dic.name }}td>
<td>{
{ dic.age }}td>
tr>
{% endfor %}
table>
<h2>for...empty h2>
<ul>
{% for l in ll %}
<li>{
{ l }}li>
{% empty %}
<li> li>
{% endfor %}
ul>
<h2>forloop h2>
{% for dic in user_list %}
{% for key,value in dic.items %}
{
{ forloop.parentloop.counter }}
<p>{
{ key }}:{
{ value }}p>
{% endfor %}
{% endfor %}
<h2>ifh2>
{% if b %}
<p>b true p>
{% else %}
<p>b false p>
{% endif %}
<h2>with h2>
{% with forloop.parentloop.counter as aaa %}
{
{ aaa }}
{% endwith %}
{% with lqzisnbplus as a %}
{
{ a }}
{
{ lqzisnbplus }}
{% endwith %}
<h2>csrfh2>
{% csrf_token %}
<input type="text" name="csrfmiddlewaretoken" value="uC35XuP1J2Va74ArYiNw4TMZ0PaZ6V4qvVGCsUQcqiKF5Sr8IrWS0rzpmOmPBrjY">
body>