1. 程式人生 > >stark元件配置,二層URL

stark元件配置,二層URL

 

  • 1、django的admin配置
  • 2 stark元件開發
  • 3、2層url分發
  • 4、小結

 

1、django的admin配置

model.py

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    age
=models.IntegerField() def __str__(self): return self.name class Book(models.Model): title=models.CharField(max_length=32) def __str__(self): return self.title
View Code

admin.py配置

from django.contrib import admin

# Register your models here.
from .models import * class UserAdmin(admin.ModelAdmin): list_display = ["pk",'name','age'] list_filter = ['name','age'] # 定製action具體方法 def func(self,request,queryset): queryset.update(age=44) func.short_description = "批量初始化操作" actions = [func] admin.site.register(UserInfo,UserAdmin) admin.site.register(Book) admin.py
View Code

 

makemigrations
migrate
createsuperuser (alex 1234qwer)

2 stark元件開發

 1、 python manage.py startapp stark

 

 2、stark/service/stark.py (單例物件)

 

# -*- coding: utf-8 -*-
# @Time    : 2018/08/17 0017 14:46
# @Author  : Venicid

class ModelStark(object):
    def __init__(self,model, site):
        self.model = model
        self.site = site


class StarkSite(object):
    """site單例類"""
    def __init__(self):
        self._registry = {}

    def register(self,model, stark_class=None):
        """註冊"""
        if not stark_class:
            stark_class = ModelStark

        self._registry[model] = stark_class(model,self)


site = StarkSite()   # 單例物件
View Code

 

3. settings中配置'  stark.apps.StarkConfig'

 

 

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

class StarkConfig(AppConfig):
    name = 'stark'

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

 

4.models.py (一對一,一對多,多對多)

app01這個app下建立models表

from django.db import models

# Create your models here.

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()

    # 與AuthorDetail建立一對一的關係
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class AuthorDetail(models.Model):

    nid = models.AutoField(primary_key=True)
    birthday=models.CharField(max_length=64,default="")
    telephone=models.BigIntegerField()
    addr=models.CharField( max_length=64)

    def __str__(self):
        return self.addr



class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()
    def __str__(self):
        return self.name


class Book(models.Model):

    nid = models.AutoField(primary_key=True,verbose_name="書籍號")
    title = models.CharField( max_length=32,verbose_name="書籍名")
    publishDate=models.DateField(verbose_name="出版日期")
    price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="價格")

    # 與Publish建立一對多的關係,外來鍵欄位建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 與Author表建立多對多的關係,ManyToManyField可以建在兩個模型中的任意一個,自動建立第三張表
    authors=models.ManyToManyField(to='Author',)
    def __str__(self):
        return self.title
View Code

5、stark中註冊

在app01下建立一個stark的名字的Py檔案,將建立的模型表註冊進去。

 

 

6 配置urls,啟動

 

3、2層url分發

 1、構造1層url

 

 stark/service/stark.py

# -*- coding: utf-8 -*-
# @Time    : 2018/08/17 0017 14:46
# @Author  : Venicid
from django.conf.urls import url

class ModelStark(object):
    def __init__(self,model, site):
        self.model = model
        self.site = site

class StarkSite(object):
    """site單例類"""
    def __init__(self):
        self._registry = {}

    def register(self,model, stark_class=None):
        """註冊"""
        if not stark_class:
            stark_class = ModelStark

        self._registry[model] = stark_class(model,self)

    def get_urls(self):
        """構造一層urls app01/book"""
        temp = []
        print(self._registry)

        for model, stark_class_obj in self._registry.items():
            app_label = model._meta.app_label     # app01
            model_name = model._meta.model_name   # book
            temp.append(url(r'^%s/%s'%(app_label, model_name),([],None,None)))

        return temp

    @property
    def urls(self):

        # return [],None,None
        return self.get_urls(),None,None

site = StarkSite()   # 單例物件
View Code

 

 

可以通過stak下迴圈取到不同的app名字和模型表拼接一個個的url.

 

2、不同的model表,顯示不同的url

 3、ModelStark

ModelStark()
self.model:使用者訪問的模型表

4、構造2層urls

  

from django.conf.urls import url
from django.shortcuts import HttpResponse

class ModelStark(object):
    def __init__(self,model, site):
        self.model = model
        self.site = site

    def list_view(self, request):
     #檢視檢視
print(self.model) # <class 'app01.models.Book'> 使用者訪問的模型表 return HttpResponse('list_view') def add(self, request):
     #增加檢視
return HttpResponse('add') def delete(self, request, id):
     #刪除檢視
return HttpResponse('delete') def change(self, request, id):
     #修改檢視
return HttpResponse('change') def get_urls2(self): """構造 add/delete/change""" temp = [] temp.append(url(r'^$', self.list_view)) temp.append(url(r'^add/', self.add)) temp.append(url(r'^(\d+)/delete/', self.delete)) temp.append(url(r'^(\d+)/change/', self.change)) return temp #還是返回一個列表 @property def urls2(self): return self.get_urls2(), None, None #返回[],None,None,這種指定的格式。 class StarkSite(object): """site單例類""" def __init__(self): self._registry = {} def register(self,model, stark_class=None): """註冊""" if not stark_class: stark_class = ModelStark self._registry[model] = stark_class(model,self)
     #在這裡注意以模型表為鍵,<class 'app01.models.Author'>: <app01.stark.AuthorConfig object at 0x00000154D50F4240>      #模型表的配置為值,如果沒有配置預設使用ModelStark.
def get_urls(self): """構造一層urls app01/book""" temp = [] for model, stark_class_obj in self._registry.items(): print(model, 'stark_clas_obj', stark_class_obj) # 不同的model模型表 """ <class 'app01.models.UserInfo'> ----> <app01.starkadmin.UserConfig object at 0x00000072DDB65198> <class 'app01.models.Book'> ----> <stark.service.stark.ModelStark object at 0x00000072DDB65240> """ app_label = model._meta.app_label # app01 model_name = model._meta.model_name # book # temp.append(url(r'^%s/%s'%(app_label, model_name),([],None,None))) temp.append(url(r'^%s/%s'%(app_label, model_name),stark_class_obj.urls2)) #這裡迴圈一條,呼叫配置類裡面的url2,拼接上增刪改查。 """ path('app01/userinfo/',UserConfig(Userinfo,site).urls2), path('app01/book/',ModelStark(Book,site).urls2), """ return temp @property def urls(self): # return [],None,None return self.get_urls(),None,None site = StarkSite() # 單例物件

這裡注意為什麼要用stark_class_obj,因為這個是ModelStark的例項,傳入的model是什麼,那麼self.model就是什麼,因為以model為鍵,這個stark_class_obj為值,引數傳入的

是model,所以就能識別出來哪個表的增刪改查。

_registry  {<class 'app01.models.Author'>: <app01.stark.AuthorConfig object at 0x00000154D50F4240>}
 

4、小結

  1. url分發:

url(r'^stark/', ([],None,None))

url(r'^stark/', stark.site.urls)

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

 

  2. 使用者可以自定製配置頁面,所以呼叫配置類 stark_class_obj.urls2

# 分發增刪改查
temp.append(url(r'%s/%s/'%(app_label,model_name), stark_class_obj.urls2))

  

  3.ModelStark

ModelStark()
self.model:使用者訪問的模型表

  

model_name = self.model._meta.model_name
app_label = self.model._meta.app_label

  

 

 

 

  • 1、django的admin配置
  • 2 stark元件開發
  • 3、2層url分發
  • 4、小結

 

1、django的admin配置

model.py

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    age=models.IntegerField()

    def __str__(self):
        return self.name


class Book(models.Model):
    title=models.CharField(max_length=32)

    def __str__(self):
        return self.title
View Code

admin.py配置

from django.contrib import admin

# Register your models here.
from .models import *

class UserAdmin(admin.ModelAdmin):
    list_display = ["pk",'name','age']
    list_filter = ['name','age']

    # 定製action具體方法
    def func(self,request,queryset):
        queryset.update(age=44)

    func.short_description = "批量初始化操作"
    actions = [func]

admin.site.register(UserInfo,UserAdmin)
admin.site.register(Book)

admin.py
View Code

 

makemigrations
migrate
createsuperuser (alex 1234qwer)

2 stark元件開發

 1、 python manage.py startapp stark

 

 2、stark/service/stark.py (單例物件)

 

# -*- coding: utf-8 -*-
# @Time    : 2018/08/17 0017 14:46
# @Author  : Venicid

class ModelStark(object):
    def __init__(self,model, site):
        self.model = model
        self.site = site


class StarkSite(object):
    """site單例類"""
    def __init__(self):
        self._registry = {}

    def register(self,model, stark_class=None):
        """註冊"""
        if not stark_class:
            stark_class = ModelStark

        self._registry[model] = stark_class(model,self)


site = StarkSite()   # 單例物件
View Code

 

3. settings中配置'  stark.apps.StarkConfig'

 

 

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

class StarkConfig(AppConfig):
    name = 'stark'

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

 

4.models.py (一對一,一對多,多對多)

app01這個app下建立models表

from django.db import models

# Create your models here.

class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    age=models.IntegerField()

    # 與AuthorDetail建立一對一的關係
    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class AuthorDetail(models.Model):

    nid = models.AutoField(primary_key=True)
    birthday=models.CharField(max_length=64,default="")
    telephone=models.BigIntegerField()
    addr=models.CharField( max_length=64)

    def __str__(self):
        return self.addr



class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name=models.CharField( max_length=32)
    city=models.CharField( max_length=32)
    email=models.EmailField()
    def __str__(self):
        return self.name


class Book(models.Model):

    nid = models.AutoField(primary_key=True,verbose_name="書籍號")
    title = models.CharField( max_length=32,verbose_name="書籍名")
    publishDate=models.DateField(verbose_name="出版日期")
    price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="價格")

    # 與Publish建立一對多的關係,外來鍵欄位建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)
    # 與Author表建立多對多的關係,ManyToManyField可以建在兩個模型中的任意一個,自動建立第三張表
    authors=models.ManyToManyField(to='Author',)
    def __str__(self):
        return self.title
View Code

5、stark中註冊

在app01下建立一個stark的名字的Py檔案,將建立的模型表註冊進去。

 

 

6 配置urls,啟動

 

3、2層url分發

 1、構造1層url

 

 stark/service/stark.py

# -*- coding: utf-8 -*-
# @Time    : 2018/08/17 0017 14:46
# @Author  : Venicid
from django.conf.urls import url

class ModelStark(object):
    def __init__(self,model, site):
        self.model = model
        self.site = site

class StarkSite(object):
    """site單例類"""
    def __init__(self):
        self._registry = {}

    def register(self,model, stark_class=None):
        """註冊"""
        if not stark_class:
            stark_class = ModelStark

        self._registry[model] = stark_class(model,self)

    def get_urls(self):
        """構造一層urls app01/book"""
        temp = []
        print(self._registry)

        for model, stark_class_obj in self._registry.items():
            app_label = model._meta.app_label     # app01
            model_name = model._meta.model_name   # book
            temp.append(url(r'^%s/%s'%(app_label, model_name),([],None,None)))

        return temp

    @property
    def urls(self):

        # return [],None,None
        return self.get_urls(),None,None

site = StarkSite()   # 單例物件
View Code

 

 

可以通過stak下迴圈取到不同的app名字和模型表拼接一個個的url.

 

2、不同的model表,顯示不同的url

 3、ModelStark

ModelStark()
self.model:使用者訪問的模型表

4、構造2層urls

  

from django.conf.urls import url
from django.shortcuts import HttpResponse

class ModelStark(object):
    def __init__(self,model, site):
        self.model = model
        self.site = site

    def list_view(self, request):
     #檢視檢視
print(self.model) # <class 'app01.models.Book'> 使用者訪問的模型表 return HttpResponse('list_view') def add(self, request):
     #增加檢視
return HttpResponse('add') def delete(self, request, id):
     #刪除檢視
return HttpResponse('delete') def change(self, request, id):
     #修改檢視
return HttpResponse('change') def get_urls2(self): """構造 add/delete/change""" temp = [] temp.append(url(r'^$', self.list_view)) temp.append(url(r'^add/', self.add)) temp.append(url(r'^(\d+)/delete/', self.delete)) temp.append(url(r'^(\d+)/change/', self.change)) return temp #還是返回一個列表 @property def urls2(self): return self.get_urls2(), None, None #返回[],None,None,這種指定的格式。 class StarkSite(object): """site單例類""" def __init__(self): self._registry = {} def register(self,model, stark_class=None): """註冊""" if not stark_class: stark_class = ModelStark self._registry[model] = stark_class(model,self)
     #在這裡注意以模型表為鍵,<class 'app01.models.Author'>: <app01.stark.AuthorConfig object at 0x00000154D50F4240>      #模型表的配置為值,如果沒有配置預設使用ModelStark.
def get_urls(self): """構造一層urls app01/book""" temp = [] for model, stark_class_obj in self._registry.items(): print(model, 'stark_clas_obj', stark_class_obj) # 不同的model模型表 """ <class 'app01.models.UserInfo'> ----> <app01.starkadmin.UserConfig object at 0x00000072DDB65198> <class 'app01.models.Book'> ----> <stark.service.stark.ModelStark object at 0x00000072DDB65240> """ app_label = model._meta.app_label # app01 model_name = model._meta.model_name # book # temp.append(url(r'^%s/%s'%(app_label, model_name),([],None,None))) temp.append(url(r'^%s/%s'%(app_label, model_name),stark_class_obj.urls2)) #這裡迴圈一條,呼叫配置類裡面的url2,拼接上增刪改查。 """ path('app01/userinfo/',UserConfig(Userinfo,site).urls2), path('app01/book/',ModelStark(Book,site).urls2), """ return temp @property def urls(self): # return [],None,None return self.get_urls(),None,None site = StarkSite() # 單例物件

這裡注意為什麼要用stark_class_obj,因為這個是ModelStark的例項,傳入的model是什麼,那麼self.model就是什麼,因為以model為鍵,這個stark_class_obj為值,引數傳入的

是model,所以就能識別出來哪個表的增刪改查。

_registry  {<class 'app01.models.Author'>: <app01.stark.AuthorConfig object at 0x00000154D50F4240>}
 

4、小結

  1. url分發:

url(r'^stark/', ([],None,None))

url(r'^stark/', stark.site.urls)

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

 

  2. 使用者可以自定製配置頁面,所以呼叫配置類 stark_class_obj.urls2

# 分發增刪改查
temp.append(url(r'%s/%s/'%(app_label,model_name), stark_class_obj.urls2))

  

  3.ModelStark

ModelStark()
self.model:使用者訪問的模型表

  

model_name = self.model._meta.model_name
app_label = self.model._meta.app_label