一、背景

CRM项目重新总结一下,重写之前的项目发现有不少知识点已经忘记,所以特此来重新总结一下一便后续能够回忆起

二、代码分析

1. 核心代码

from django.conf.urls import url
from django.shortcuts import HttpResponse,render class VbcConfig(object):
list_display = []
def __init__(self,model_class,site):
self.model_class = model_class
self.site = site def get_urls(self):
app_model_name = (self.model_class._meta.app_label,self.model_class._meta.model_name,)
url_pattern = [
url(r'^$',self.change_list_view,name='%s_%s_change_list'%app_model_name),
url(r'^add/$',self.add_view,name='%s_%s_add'%app_model_name),
url(r'^(\d+)/change/$',self.change_view,name='%s_%s_change'%app_model_name),
url(r'^(\d+)/delete/$',self.delete_view,name='%s_%s_delete'%app_model_name),
]
return url_pattern
@property
def urls(self):
return self.get_urls() # ########################### 处理请求的方法 #############
def change_list_view(self,request,*args,**kwargs): # 处理表头
head_list = []
for field_name in self.list_display:
if isinstance(field_name,str):
verbose_name= self.model_class._meta.get_field(field_name).verbose_name
else:
verbose_name = field_name(self,is_header=True)
head_list.append(verbose_name) # 处理数据
data_list = self.model_class.objects.all() new_data_list = []
for row in data_list:
temp =[]
for field_name in self.list_display:
if isinstance(field_name,str):
val = getattr(row,field_name)
else:
val = field_name(self,row)
temp.append(val) new_data_list.append(temp) return render(request,'changelist.html',{'new_data_list':new_data_list,'head_list':head_list})
def add_view(self,request,*args,**kwargs):
return HttpResponse('添加')
def change_view(self,request,*args,**kwargs):
return HttpResponse('修改')
def delete_view(self,request,*args,**kwargs):
return HttpResponse('删除') class VbcSite(object):
def __init__(self):
self._registry = {} def registry(self,model_class,vbc_config_class=None):
if not vbc_config_class:
vbc_config_class = VbcConfig # 如果没有自定义Config类则实例化VbcConfig类
self._registry[model_class] = vbc_config_class(model_class,self) # 将数据库model传入进来进行实例化 def get_urls(self):
url_pattern = []
for model_class,vbc_config_obj in self._registry.items():
print(model_class,vbc_config_obj)
# 为每一个类,创建4个url
"""
/stark/app01/userinfo/
/stark/app01/userinfo/add
/stark/app01/userinfo/(\d+)/change/
/stark/app01/userinfo/(\d+)/delete/
"""
app_name = model_class._meta.app_label
model_name = model_class._meta.model_name
curd_url = url(r'%s/%s/'%(app_name,model_name),(vbc_config_obj.urls,None,None)) url_pattern.append(curd_url)
return url_pattern @property
def urls(self):
return (self.get_urls(),None,'vbc') site = VbcSite()

2. 实例化model类

from django.shortcuts import HttpResponse
from django.utils.safestring import mark_safe
from stark.service import v1
from app01 import models class UserInfoConfig(v1.VbcConfig):
def checkbox(self,obj=None,is_header=False):
if is_header:
return '序号'
return mark_safe("<input type='checkbox' name='pk' value='%s'></>"%obj.id)
def edit(self,obj=None,is_header=False):
if is_header:
return '操作'
return mark_safe('<a href="/edit/%s">编辑</a>'%obj.id) def delete(self,obj=None,is_header=False):
if is_header:
return '表头'
return mark_safe('<a href="/edit/%s">删除</a>'%obj.id)
list_display = [checkbox,'id','name',edit,delete] class RoleConfig(v1.VbcConfig): list_display = ['id','title'] class UserTypefig(v1.VbcConfig): list_display = ['id','title'] v1.site.registry(models.UserInfo,UserInfoConfig)
v1.site.registry(models.UserType,UserTypefig)
v1.site.registry(models.Role,RoleConfig)

三. 学习的知识点:如何从model中获取字段名称

1. model

from django.db import models

# Create your models here.

class UserInfo(models.Model):
name = models.CharField(max_length=32,verbose_name='用户名') def __str__(self):
return self.name class Role(models.Model):
title = models.CharField(max_length=32,verbose_name='用户角色')
users = models.ForeignKey(to='UserInfo',verbose_name='用户职位',on_delete=models.CASCADE) def __str__(self):
return self.title class UserType(models.Model):
title = models.CharField(max_length=32,verbose_name='用户类型') def __str__(self):
return self.title

2. 代码

# ########################### 处理请求的方法  #############
def change_list_view(self,request,*args,**kwargs): # 处理表头
head_list = []
for field_name in self.list_display:
if isinstance(field_name,str):
verbose_name= self.model_class._meta.get_field(field_name).verbose_name # 在_meta中有个get_field方法,通过将model字段名称传入进去,最后执行.verbose_name就可以获取model字段名称
else:
verbose_name = field_name(self,is_header=True)
head_list.append(verbose_name) # 处理数据
data_list = self.model_class.objects.all() new_data_list = []
for row in data_list:
temp =[]
for field_name in self.list_display:
if isinstance(field_name,str):
val = getattr(row,field_name)
else:
val = field_name(self,row)
temp.append(val) new_data_list.append(temp) return render(request,'changelist.html',{'new_data_list':new_data_list,'head_list':head_list})

小结:

self.model_class._meta.get_field(field_name).verbose_name
# 在_meta中有个get_field方法,通过将model字段名称传入进去,最后执行.verbose_name就可以获取model字段名称

Django如何从Model中获取字段名称——verbose_name的更多相关文章

  1. Django的model中日期字段设置默认值的问题

    之前写过这样一个model: class MonthlyFeeMember(models.Model): worker = models.ForeignKey(Student, verbose_nam ...

  2. oracle,如何查看视图结构,获得视图中的字段名称、字段类型、字段长度等。

    需要获得一个视图中的字段名称.字段类型.字段长度等信息,该如何编写sql语句.通过select * from user_views可以获得给定用户下所有的视图名称了,但是没找到如何获取视图结构的解决方 ...

  3. legend3---laravel中获取控制器名称和方法名称

    legend3---laravel中获取控制器名称和方法名称 一.总结 一句话总结: \Route::current()->getActionName();会有完整的当前控制器名和方法名 pub ...

  4. 增强 用文本增强修改SAP标准屏幕中的字段名称 属于元素的文本增强

    如果想要改变标准屏幕中的字段名称,如把物料主数据基本数据元素的名字改为我们想要的名字 . 1.首先,事务MM03进入物料主数据的基本数据2视图中,将鼠标光标放在需要更改的字段“页格式”上,然后按F1键 ...

  5. django的html模板中获取字典的值

    在django的html模板中获取字典中的值应当直接使用 字典.[key] 的方式 {% for i in lists %} <li id="{{i.id}}" class ...

  6. 【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件

    代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar 这篇还不够完善,请看更完善的续篇 ...

  7. resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致

    1.1.1.1.      步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启  其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...

  8. Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField 关联关系字段 (Relationship fields)

    ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系. 例如,一本书由一家出版社出版,一家出版社可以出版很多书.一本书由多个 ...

  9. Django model 中的字段解释

    Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需 ...

随机推荐

  1. Consul入门

    推荐: Consul 原理和使用简介 启动:consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node Litao-Mac ...

  2. 专题训练之2-sat

    推荐几篇博客:https://blog.csdn.net/JarjingX/article/details/8521690 研究总结2-sat问题 https://blog.csdn.net/wher ...

  3. purfer序列题表

    purfer序列是对于带编号(互不相同)的无根树进行编码得到的,对于同样的n个顶点,其有n-2项,有n^(n-2)种,而且每种都合法(如果只要求他是一棵树的话)(可以通过证明翻译过程维持了各部分的树的 ...

  4. 【队列】【P2827】【NOIP2016D2T3】蚯蚓

    传送门 Description 本题中,我们将用符号 $\lfloor c \rfloor$ 表示对 $c$ 向下取整,例如:$\lfloor 3.0 \rfloor = \lfloor 3.1 \r ...

  5. LightOJ 1375 - LCM Extreme 莫比乌斯反演或欧拉扩展

    题意:给出n [1,3*1e6] 求 并模2^64. 思路:先手写出算式 观察发现可以化成 那么关键在于如何求得i为1~n的lcm(i,n)之和.可以知道lcm(a,b)为ab/gcd(a,b) 变换 ...

  6. CPU上下文切换的次数和时间(context switch)

    什么是CPU上下文切换? 现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个任务,这个过程叫做上下文切换.时间片轮转的方式,使得 ...

  7. UIActivityIndicatorView---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址: iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 UIActivityIndicatorViewactivityIndicatorVi ...

  8. HDU 1026 Ignatius and the Princess I (广搜)

    题目链接 Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius ...

  9. js 基本类型&引用类型

    1.基本的数据类型有:undefined,boolean,number,string,null.基本类型的访问是按值访问的,就是说你可以操作保存在变量中的实际的值 基本类型的比较是值的比较.用==比较 ...

  10. Angular2.0 基础: User Input

    1.Angular 2.0 中的变量 对输入值的获取,我们可以通过$event 来获取,也可以通过变量来获取. template: ` <input (keyup)="onKey($e ...