day18 stark组件开发之动态生成url

思路:


项目目录

在两个app中创建表结构
app01/models.py

from django.db import models

# Create your models here.
class Depart(models.Model):
    """
    部门表
    """
    title = models.CharField(verbose_name='部门名称', max_length=32)


class UserInfo(models.Model):
    """
    用户表
    """
    name = models.CharField(verbose_name='姓名', max_length=32)
    age = models.CharField(verbose_name='年龄', max_length=32)
    email = models.CharField(verbose_name='邮箱', max_length=32)
    depart = models.ForeignKey(verbose_name='部门', to='Depart',on_delete=models.CASCADE)

app02/models.py

from django.db import models

# Create your models here.
class Host(models.Model):
    """
    主机表
    """
    host = models.CharField(verbose_name='主机名', max_length=32)
    ip = models.GenericIPAddressField(verbose_name='IP')


class Role(models.Model):
    """
    角色
    """
    title = models.CharField(verbose_name='角色名称', max_length=32)

设置路由

from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
from stark.service.v1 import site

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^stark/', site.urls),
]

stark组件编写动态生成url代码

stark/service/v1.py

# -*- encoding: utf-8 -*-
"""
@File    : v1.py
@Time    : 2022/1/16 19:59
@Author  : simon
@Email   : 294168604@qq.com
@Software: PyCharm
"""
from django.conf.urls import url
from django.shortcuts import HttpResponse


class StarkSite(object):
    def __init__(self):
        self._registry = []
        self.app_name = 'stark'
        self.namespace = 'stark'

    def register(self, model_class, handler_class):
        """

        :param model_class: 是models中的数据库表对应的类。 models.UserInfo
        :param handler_class: 处理请求的视图函数所在的类
        :return:
        """
        """
        self._registry = [
            {'model_class':models.Depart,'handler':DepartHandler(models.Depart)},
            {'model_class':models.UserInfo,'handler':UserInfoHandler(models.UserInfo)}
            {'model_class':models.Host,'handler': HostHandler(models.Host) }
        ]
        """
        self._registry.append({'model_class': model_class, 'handler': handler_class(model_class)})

    def get_urls(self):
        patterns = []
        for item in self._registry:
            model_class = item['model_class']
            handler = item['handler']
            app_label, model_name = model_class._meta.app_label, model_class._meta.model_name
            patterns.append(url(r'%s/%s/list/$' % (app_label, model_name,), handler.changelist_view))
            patterns.append(url(r'%s/%s/add/$' % (app_label, model_name,), handler.add_view))
            patterns.append(url(r'%s/%s/change/(\d+)/$' % (app_label, model_name,), handler.change_view))
            patterns.append(url(r'%s/%s/del/(\d+)/$' % (app_label, model_name,), handler.change_view))

        return patterns

    @property
    def urls(self):
        return self.get_urls(), self.app_name, self.namespace


site = StarkSite()


在stark项目的apps.py文件加上下面的代码,ready函数的作用是让Django在启动时自动扫描每一个app下面的stark.py文件

from django.apps import AppConfig
from django.utils.module_loading import autodiscover_modules


class StarkConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'stark'

    def ready(self):
        autodiscover_modules('stark')

不同的app编写调用自动生成url模块

app01/stark.py

# -*- encoding: utf-8 -*-
"""
@File    : stark_simon.py
@Time    : 2022/1/16 20:09
@Author  : simon
@Email   : 294168604@qq.com
@Software: PyCharm
"""
from django.shortcuts import HttpResponse
from stark.service.v1 import site
from app01 import models


class DepartHandler(object):

    def __init__(self, model_class):
        self.model_class = model_class

    def changelist_view(self, request):
        """
        列表页面
        :param request:
        :return:
        """
        return HttpResponse('部门列表页面')

    def add_view(self, request):
        """
        添加页面
        :param request:
        :return:
        """
        pass

    def change_view(self, request, pk):
        """
        编辑页面
        :param request:
        :param pk:
        :return:
        """
        pass

    def delete_view(self, request, pk):
        """
        删除页面
        :param request:
        :param pk:
        :return:
        """
        pass


site.register(models.Depart, DepartHandler)


class UserInfoHandler(object):
    def __init__(self, model_class):
        self.model_class = model_class

    def changelist_view(self, request):
        """
        列表页面
        :param request:
        :return:
        """
        return HttpResponse('用户列表页面')

    def add_view(self, request):
        """
        添加页面
        :param request:
        :return:
        """
        pass

    def change_view(self, request, pk):
        """
        编辑页面
        :param request:
        :param pk:
        :return:
        """
        pass

    def delete_view(self, request, pk):
        """
        删除页面
        :param request:
        :param pk:
        :return:
        """
        pass


site.register(models.UserInfo, UserInfoHandler)

app02/stark.py

# -*- encoding: utf-8 -*-
"""
@File    : stark_simon.py
@Time    : 2022/1/16 20:10
@Author  : simon
@Email   : 294168604@qq.com
@Software: PyCharm
"""
from django.shortcuts import HttpResponse
from stark.service.v1 import site
from app02 import models


class HostHandler(object):
    def __init__(self, model_class):
        self.model_class = model_class

    def changelist_view(self, request):
        """
        列表页面
        :param request:
        :return:
        """
        return HttpResponse('主机列表页面')

    def add_view(self, request):
        """
        添加页面
        :param request:
        :return:
        """
        pass

    def change_view(self, request, pk):
        """
        编辑页面
        :param request:
        :param pk:
        :return:
        """
        pass

    def delete_view(self, request, pk):
        """
        删除页面
        :param request:
        :param pk:
        :return:
        """
        pass


site.register(models.Host, HostHandler)


class RoleHandler(object):
    def __init__(self, model_class):
        self.model_class = model_class

    def changelist_view(self, request):
        """
        列表页面
        :param request:
        :return:
        """
        return HttpResponse('角色列表页面')

    def add_view(self, request):
        """
        添加页面
        :param request:
        :return:
        """
        pass

    def change_view(self, request, pk):
        """
        编辑页面
        :param request:
        :param pk:
        :return:
        """
        pass

    def delete_view(self, request, pk):
        """
        删除页面
        :param request:
        :param pk:
        :return:
        """
        pass


site.register(models.Role, RoleHandler)

页面效果

posted @ 2022-01-16 15:09  simon_T  阅读(102)  评论(0编辑  收藏  举报