url.py
from django.conf.urls import url
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('cbv/',views.Home.as_view()), #提交方式CBV, 一般直接写的函数都是FBV
url('detail/',views.detail), # 用于动态
url(r'detail-(?P<pid>\d+).html',views.detail2), # 给\d 添加名字pid,这样detail2用形参随意改位置不变
url(r'index12345-(?P<nid>\d+)-(?P<pid>\d+)/',views.index,name='indexx'),]
view.py
# CBV from django.views.generic import View
class Home(View):
# CBV模式:用户发来URL(http://127.0.0.1:8000/cbv/ ;method:get)。先通过urls.py定位到Home类。然后根据用户的提交方式(如get)
# 通过反射机制确认Home类里有没有写相关的方法
# View模块就定义了dispatch方法的getattr就是反射,确认子类Home里有没有get或post等方法。所以我们可以修改dispatch方法来做相应的修饰
"""
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
"""
def dispatch(self, request, *args, **kwargs):
print("before")
result = super(Home, self).dispatch(request, *args, **kwargs) # 继承父类的dispatch方法,result=handler(request, *args, **kwargs)
print("after")
return result
def get(self, request):
print('get', request.method)
return render(request, 'cbv.html')
def post(self, request):
print('post', request.method)
return render(request, 'cbv.html')
USER_LIST1 = {
'1': {'name': 'root1', 'IP': '1.1.1.1'},
'2': {'name': 'root2', 'IP': '2.2.2.2'},
'3': {'name': 'root3', 'IP': '3.3.3.3'},
}
def detail(request):
# 需求:写个index页面,显示用户名,点击用户名,就能在detail页面返回该用户的各种信息。但是通过index.html发送来nid
# 这种方式一般用于动态匹配,不太适用(因为后面的nid的值可以改动)。
nid = request.GET.get('nid')
userInfo = USER_LIST1[nid]
return render(request, 'detail.html', {'userInfo': userInfo})
# def detail2(request,uid,pid):
def detail2(request,*args,**kwargs):
# 这种方式一般是说url是不变的页面
userInfo = USER_LIST1[kwargs['pid']]
return render(request,'detail.html',{'userInfo':userInfo})
def index(request,nid,pid):
print(request.path_info) # 比如你在网页输入/index12345-4-3/ ,那么 request.path_info 就是/index12345-4-3/
# 如果写 request.path_info 那么点击submit就会重定向到一开始登录的index页面,如果<form action="{% url 'indexx' pid=3 nid=4 %}" method="POST">那么就会跳转到 index12345-3-4 的页面。[2种用法] )
# print(nid,pid)
print(reverse('indexx',kwargs={'nid':1,'pid':11})) # url输入index12345-1-4 ,url接收后,调用index函数,用reverse就能将name=indexx的url替换成你想要的新的url,比如上面的就做成新的/index12345-1-11/
# print(reverse('indexx',args=(10,)) # 如果url写的正则匹配没有指定名字(?P<nid>(\d+)),就用这种reverse
return render(request, 'index.html', {'user_list1': USER_LIST1})
index.html
<body>
{% for k,info in user_list1.items %}
{# <p><li><a target="_blank" href="/detail?nid={{ k }}">{{ info.name }}</a></li></p>#}
{# 另一种方式 #这种方式一般是说url是不变的页面#}
<p><li><a target="_blank" href="/detail-{{ k }}.html">{{ info.name }}</a></li></p>
{% endfor %}
<form action="{% url 'indexx' pid=3 nid=4 %}" method="POST"> #一点提交跳转到/index12345-4-33/
{# <form action="{% url 'indexx' 3 %}" method="POST">#}
{# <form action="{{ request.path_info }}" method="POST">#} #一点提交,跳转request.path_info的路径
<input type="text" placeholder="name"/>
<input type="text" placeholder="IP"/>
<input type="submit" value="添加"/>
</form>
</body>
cbv.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/cbv/" method="post">
<input type="text"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
如果在浏览器输入http://127.0.0.1:7000/cbv/ ,那么pycharm会输出
总结:
上面的路由系统对应关系伪代码见下,a-e上面以写
路由系统URL
a. /index/ -> 函数或类
b. /index/(\d+) -> 函数或类
c. /index/(?P<nid>\d+) -> 函数或类
d. /index/(?P<nid>\d+) name='root' -> 函数或类
reverse('root')
{% url 'root' 1%}
e. /crm/ include('app01.urls') -> 路由分发
f. 默认值
#如果在url中以字典形式写入,那么视图函数一定要加上形参名为name,然后你就可以取那么值了
url(r'^index/', views.index, {'name': 'root'}),
def index(request,name):
print(name) # 输出 root 但是这个不能用reverse('root')
return HttpResponse('OK')
g. 命名空间
如果2个 在同名的目录的url下有 admin和crm都对应 app01.urls,然后你在views的视图函数中想要reverse出路径,那么就要用到命名空间。
/admin/ include('app01.urls',namespace='m1')
/crm/ include('app01.urls',namespace='m2')
app01.urls
#注意这里要加 app_name = "app01"
urlpatterns = [
url(r'^index/(?P<nid>\d+)',views.index, name='indexx'),
]
{% url 'm1:indexx' nid=1 %}
reverse('m1:indexx',kwargs={'nid':1}) 输出 /admin/indexreverse('m2:indexx',kwargs={'nid':1}) 输出 /crm/index