django学习笔记---CBV和FBV模式以及一些url写法(request,name)的应用场景

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值