Django之路由系统的分发本质和admin的使用

一、Django之路由系统的分发本质:

Django大致工作流程

1、客户端发送请求(get/post)经过web服务器、Django中间件、 到达路由分配系统 
2、路由分配系统根据提取 request中携带的的url路径(path)与视图函数映射关系列表中,匹配到1个视图函数,foo(request)执行;

3、视图函数 使用原生SQL或者ORM去数据库拿到数据,在服务端进行渲染(模板+数据渲染)

4、视图函数return一个 response对象 返回客户端

 

本文主要介绍 Django路由分配系统本质和admin的使用

  实际上Django的路由分配系统是分级匹配的一个制度。

  当urls.py中有 include 包含下一个应用的相关路径的时候,我们可以查看include 的函数返回的值,可以知道: return (urlconf_module, app_name, namespace)返回一个元祖。

第一个参数 urlconf_module 是一个列表,namespace和,app_name 是一个字符串变量。

urlpatterns也可以这样写:

urlpatterns = [
    url(r'^admin/', admin.site.urls),  #创建Django项目本身的admin 相关陆路由
    url(r'^index/xxx/xxx/xx/xx/xx/', views.index,name='inx'),  #url = reverse('inx')
    url(r'^login/', views.login),
    url(r'^monitor/', include('monitor.urls')),
    url(r'^openstack/', include('openstack.urls',namespace='o')), #url = reverse('o:hosts')
    /monitor/hosts/
    url(r'^login/', views.login),
    url(r'^monitor/', ([
                            url(r'^hosts/',mviews.hosts,name='hhhhh'),   #url = reverse('oo:hhhhh')
                            url(r'^c1/',mviews.hosts),
                            url(r'^x1/', ([
                                            url(r'^xxx1/',mviews.hosts),
                                            url(r'^xxx2/',mviews.hosts,name='xx2'),   #url = reverse('mm:uu:xx2')
                                            url(r'^xxx3/',mviews.hosts),
                                            url(r'^xxx4/',mviews.hosts),
                                          ],None,None)),
                            url(r'^c2/',mviews.hosts),
                            url(r'^c3/',mviews.hosts),
                       ],None,'mm')),
    url(r'^openstack/', ([
                            url(r'^hosts/',oviews.hosts,name='hhhhh'),  url = reverse('oo:hhhh')
                            url(r'^c1/',oviews.hosts),
                            url(r'^c2/',oviews.hosts),
                            url(r'^c3/',oviews.hosts),
                       ],None,'oo')),
]

 

同事也可以是使用for 生成URL:

for i in range(10):
    temp = []
    for j in range(5):
        temp.append(url(r'^inner_%s/' % j, views.login))
    v = url(r'^login_%s/' %i, (temp,None,None))
    urlpatterns.append(v)

这样循环生成的url 是最外层是 login_%s又十个第二层是5个 inner_%s .  共生成 50个路径可供匹配。

 

 二、admin的使用 

Django Admin使用方法

Django为开发者提供一个快速实现表增删改查的工具。

当创建Django项目的时候,项目自动会有:http://127.0.0.1:8002/admin/

当创建models文件时:

from django.db import models

class Department(models.Model):
    """
    部门表
    """
    title = models.CharField(max_length=32)
    code = models.CharField(max_length=32,default='1002')

    def __str__(self):
        return self.title

class UserInfo(models.Model):
    """
    用户表
    """
    name = models.CharField(max_length=32)
    email = models.EmailField(max_length=32)
    dp = models.ForeignKey(to='Department')

class Role(models.Model):
    """
    角色表
    """
    title = models.CharField(max_length=32)
    users = models.ManyToManyField(to='UserInfo')
models

当 需要生成 /admin/app01/department/   路径的时候需要在admin.py 注册:

from app01 import models
admin.site.register(models.Department)

当注册后,就自动生成4个url:

# 生成URL
# /admin/app01/department/           查看列表页面
# /admin/app01/department/add/        添加页面
# /admin/app01/department/1/change/   修改页面
# /admin/app01/department/1/delete/   删除页面

 

定制路由:

1. list_display,列表时,定制显示的列。

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd', 'xxxxx')
 
    def xxxxx(self, obj):
        return "xxxxx"

2. list_display_links,列表时,定制列可以点击跳转。

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd', 'xxxxx')
    list_display_links = ('pwd',)

3. list_filter,列表时,定制右侧快速筛选。

from django.utils.translation import ugettext_lazy as _
 
@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd')
 
    class Ugg(admin.SimpleListFilter):
        title = _('decade born')
        parameter_name = 'xxxxxx'
 
        def lookups(self, request, model_admin):
            """
            显示筛选选项
            :param request:
            :param model_admin:
            :return:
            """
            return models.UserGroup.objects.values_list('id', 'title')
 
        def queryset(self, request, queryset):
            """
            点击查询时,进行筛选
            :param request:
            :param queryset:
            :return:
            """
            v = self.value()
            return queryset.filter(ug=v)
 
    list_filter = ('user',Ugg,)

4. list_select_related,列表时,连表查询是否自动select_related

 5. 分页相关

# 分页,每页显示条数
    list_per_page = 100
 
# 分页,显示全部(真实数据<该值时,才会有显示全部)
    list_max_show_all = 200
 
# 分页插件
    paginator = Paginator

6. list_editable,列表时,可以编辑的列

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
    list_display = ('user', 'pwd','ug',)
    list_editable = ('ug',)

7. search_fields,列表时,模糊搜索的功能

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
     
    search_fields = ('user', 'pwd')

8. date_hierarchy,列表时,对Date和DateTime类型进行搜索

@admin.register(models.UserInfo)
class UserAdmin(admin.ModelAdmin):
 
    date_hierarchy = 'ctime'

9. preserve_filters,详细页面,删除、修改,更新后跳转回列表后,是否保留原搜索条件

10. save_as = False,详细页面,按钮为“Sava as new” 或 “Sava and add another”

11. save_as_continue = True,点击保存并继续编辑

save_as_continue = True
 
# 如果 save_as=True,save_as_continue = True, 点击Sava as new 按钮后继续编辑。
# 如果 save_as=True,save_as_continue = False,点击Sava as new 按钮后返回列表。
 
New in Django 1.10.

更多来自:http://www.cnblogs.com/wupeiqi/articles/7444717.html

 

posted @ 2018-01-16 09:50  ShengLeQi  阅读(226)  评论(0)    收藏  举报