一、路由系统(网址关系映射)

1、单一路由对应:

一个url对应一个视图函数(类)

urls.py:
url(r'^test', views.test), 
#url(r'^home', views.Test.as_view()),

views.py:
def test(request):
    print(request.method)
    return render(request, "home.html")
"""
class Test(View):

    def get(self, request):
        print(request.method)
        return render(request, "home.html")

    def post(self, request):
        print(request.method)
        return render(request, "home.html")
"""

  

 2、基于正则路由对应:

多个url对应一个视图

urls.py
# 多个url对应一个视图函数,不过在给视图函数传参时,要根据对应形参位置进行传参
url(r'^detail-(\d+)-(\d+).html', views.detail),
# 多个url对应一个视图函数,推荐这种写法,在正则匹配完毕后进行了分组分配,在传参时就可以形参位置变化也没有关系
url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail),

views.py:
#普通传参
def detail(request, nid, uid):
    print(nid, uid)
    return HttpResponse("%s - %s" % (nid, uid))
#args传参
def detail(request, *args, **kwargs):
    print(args[0], args[1])
    return HttpResponse("%s - %s" % (args[0], args[1]))
#kwargs传参
def detail(request, *args, **kwargs):
    print(kwargs["nid"], kwargs["uid"])
    return HttpResponse("%s - %s" % (kwargs["nid"], kwargs["uid"]))

 

3、name:

对URL路由关系进行命名,以后可以根据此名称生成自己想要的URL

urls.py:
url(r'^url_1/', views.index, name='i1'),
url(r'^url_2/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^url_3/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
		
views.py:
from django.urls import reverse
def func(request, *args, **kwargs):
    url1 = reverse('i1')                              # url_1/
    url2 = reverse('i2', args=(1,2,))                 # url_2/1/2/
    url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # url_3/1/9/


xxx.html:
    
    {% url "i1" %}               # url_1/
    {% url "i2" 1 2 %}           # url_2/1/2/
    {% url "i3" pid=1 nid=9 %}   # url_3/1/9/

PS:
    # 显示当前的URL
    request.path_info 

 

4、多级路由:

多级路由目的避免有多个app时,在project urls.py的路由(网址)因路径名称一致而引起的冲突

#project/urls.py:
    from django.conf.urls import url, include
    from django.contrib import admin
    urlpatterns = [
        url(r'^app1/', include("app1.urls")),
        url(r'^app2/', include("app2.urls")),
    ]

#app01/urls.py:
    from django.conf.urls import url
    from app1 import views
    urlpatterns = [
        url(r'^test', views.test),
    ]

#app02/urls.py:
    from django.conf.urls import url
    from app2 import views
    urlpatterns = [
        url(r'^test', views.test),
    ]

 

5、默认值

在路由关系映射的同时,添加额外参数,views.py中的对应函数可接受参数使用

#urls.py:
url(r'^test', views.url_test, {"value": 3}),

#views.py:
def url_test(request, value):
    print(value)
    return HttpResponse("OK")

 

6、命令空间

在project的urls.py中定义namespace后,在views中的函数会根据指定namespace生成url

6.1.、project.urls.py

from django.conf.urls import url, include


urlpatterns = [
    url(r'^app1/', include("app1.urls", namespace='name_1')),
    url(r'^app2/', include("app1.urls", namespace='name_2')),
]

6.2、app1.urls.py

from django.conf.urls import url
from app1 import views

app_name = "app1"  # 如果在project urls.py中定义namespace,那在这里就要定义一下app_name

urlpatterns = [
    url(r'^test$', views.url_test, name='i1'),
]

6.3、app1.views.py

from django.shortcuts import reverse, HttpResponse


def url_test(request):
    url_1 = reverse("name_1:i1")
    url_2 = reverse("name_2:i1")
    print(url_1, url_2)
    return HttpResponse("OK")

 

 

  

二、视图

1、FBV&CBV

1.1、 FBV (Function Base VIew)在view(视图)中基于函数编写逻辑

#urls.py:
url(r'^test', views.test),  # FBV  function base view


#views.py:
def test(request):
    if request.method == "GET":
        return render(request, 'test.html')

1.2、CBV(Class Base Viev)在view(视图)中基于类编写逻辑

#urls.py;
url(r'^home', views.Test.as_view()),  # CBV  class base view   .as_view() Test没有view所以在views.py中Test类中继承Django的View


#views.py:
from django.views import View


class Test(View):

    # 调用父类中的dispatch方法,并重写
    def dispatch(self, request, *args, **kwargs):  # 通过dispatch的反射可以找到如:get、post方法的起始点
        print("before")
        result = super(Test, self).dispatch(request, *args, **kwargs)
        return result

    def get(self, request):
        print(request.method)
        return render(request, "home.html")

    def post(self, request):
        print(request.method)
        return render(request, "home.html")

 2、HTML from表单提交数据的提取示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/test" method="POST" enctype="multipart/form-data"><!--enctypes属性没有的话,默认提交的是字符串,无法实现文件上传-->
        <p>
            <input type="text" name="user" placeholder="用户名" />
        </p>
        <p>
            <input type="password" name="pwd" placeholder="密码" />
        </p>
        <p>
            男:<input type="radio"  name="gender" value="1"/>
            女:<input type="radio" name="gender" value="2"/>
            张扬:<input type="radio" name="gender" value="3"/>
        </p>
        <p>
            男:<input type="checkbox"  name="favor" value="11"/>
            女:<input type="checkbox" name="favor" value="22"/>
            张扬:<input type="checkbox" name="favor" value="33"/>
        </p>
        <p>
            <select name="city" multiple>
                <option value="sh">上海</option>
                <option value="bj">北京</option>
                <option value="tj">天津</option>
            </select>
        </p>
        <p>
            <input type="file" name="file"/>
        </p>

        <input type="submit" value="提交"/>
    </form>
</body>
</html>
test.html

相关文章:

  • 2022-12-23
  • 2022-02-07
  • 2022-12-23
  • 2021-12-02
  • 2021-09-25
  • 2021-08-29
猜你喜欢
  • 2022-02-05
  • 2021-03-30
  • 2021-12-02
相关资源
相似解决方案