1. 程式人生 > >strak組件(3):URL別名的優化

strak組件(3):URL別名的優化

解耦 編輯 需要 get imp del handle reg edi

將生成URL別名的功能進行解耦。效果和上一節的一樣。

效果圖:

技術分享圖片

新增函數

get_url_name(self, param)   # 生成url別名,需要一個參數(list/add/edit/delete)
get_list_url_name(self)  # 獲取列表頁面URL的name  property
get_add_url_name(self)  # 獲取添加頁面URL的name  property
get_edit_url_name(self)  # 獲取編輯頁面URL的name  property
get_delete_url_name(self)  # 獲取刪除頁面URL的name  property

Stark組件

from django.urls import re_path
from django.shortcuts import HttpResponse, render


class StarkHandler(object):
    def __init__(self, model_class, prev=None):
        self.model_class = model_class
        self.prev = prev

    def list_view(self, request):
        """
        列表頁面
        :param request:
        :return:
        
""" data_list = self.model_class.objects.all() return render(request, stark/data_list.html, {data_list: data_list}) def add_view(self, request): """ 添加頁面 :param request: :return: """ return HttpResponse(添加頁面)
def edit_view(self, request, pk): """ 編輯頁面 :param request: :return: """ return HttpResponse(編輯頁面) def delete_view(self, request, pk): """ 刪除頁面 :param request: :param pk: :return: """ return HttpResponse(刪除頁面) def get_url_name(self, crud): app_label, model_name = self.model_class._meta.app_label, self.model_class._meta.model_name if self.prev: return %s_%s_%s_%s % (app_label, model_name, self.prev, crud) return %s_%s_%s % (app_label, model_name, crud) @property def get_list_url_name(self): """ 獲取列表頁面URL的name :return: """ return self.get_url_name(list) @property def get_add_url_name(self): """ 獲取添加頁面URL的name :return: """ return self.get_url_name(add) @property def get_edit_url_name(self): """ 獲取編輯頁面URL的name :return: """ return self.get_url_name(edit) @property def get_delete_url_name(self): """ 獲取刪除頁面URL的name :return: """ return self.get_url_name(delete) def get_urls(self): patterns = [ re_path(r^list/$, self.list_view, name=self.get_list_url_name), re_path(r^add/$, self.add_view, name=self.get_add_url_name), re_path(r^edit/(\d+)/$, self.edit_view, name=self.get_edit_url_name), re_path(r^delete/(\d+)/$, self.delete_view, name=self.get_delete_url_name), ] patterns.extend(self.extra_urls()) return patterns def extra_urls(self): return [] class StarkSite(object): def __init__(self): self._registry = [] self.app_name = stark self.namespace = stark def register(self, model_class, handler_class=None, prev=None): """ :param model_class: 是models中的數據庫表對應的類。 :param handler_class: 處理請求的視圖函數所在的類 :param prev: 生成URL的前綴 :return: """ if not handler_class: handler_class = StarkHandler self._registry.append({model_class: model_class, handler: handler_class(model_class, prev), prev: prev}) def get_urls(self): patterns = [] for item in self._registry: model_class = item[model_class] handler = item[handler] prev = item[prev] app_name, model_name = model_class._meta.app_label, model_class._meta.model_name if prev: patterns.append( re_path(r^%s/%s/%s/ % (app_name, model_name, prev,), (handler.get_urls(), None, None))) else: patterns.append(re_path(r^%s/%s/ % (app_name, model_name,), (handler.get_urls(), None, None))) return patterns @property def urls(self): return self.get_urls(), self.app_name, self.namespace site = StarkSite()

strak組件(3):URL別名的優化