Django如何从Model中获取字段名称——verbose_name
一、背景
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的更多相关文章
- Django的model中日期字段设置默认值的问题
之前写过这样一个model: class MonthlyFeeMember(models.Model): worker = models.ForeignKey(Student, verbose_nam ...
- oracle,如何查看视图结构,获得视图中的字段名称、字段类型、字段长度等。
需要获得一个视图中的字段名称.字段类型.字段长度等信息,该如何编写sql语句.通过select * from user_views可以获得给定用户下所有的视图名称了,但是没找到如何获取视图结构的解决方 ...
- legend3---laravel中获取控制器名称和方法名称
legend3---laravel中获取控制器名称和方法名称 一.总结 一句话总结: \Route::current()->getActionName();会有完整的当前控制器名和方法名 pub ...
- 增强 用文本增强修改SAP标准屏幕中的字段名称 属于元素的文本增强
如果想要改变标准屏幕中的字段名称,如把物料主数据基本数据元素的名字改为我们想要的名字 . 1.首先,事务MM03进入物料主数据的基本数据2视图中,将鼠标光标放在需要更改的字段“页格式”上,然后按F1键 ...
- django的html模板中获取字典的值
在django的html模板中获取字典中的值应当直接使用 字典.[key] 的方式 {% for i in lists %} <li id="{{i.id}}" class ...
- 【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件
代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar 这篇还不够完善,请看更完善的续篇 ...
- resultMap自定义映射---8.3.1. 解决列名(表中的字段名称)和实体类中的属性名不一致
1.1.1.1. 步骤一:将驼峰匹配注释掉 --------------测试完成后仍然 回来开启 其他地方可能用到 一旦注释掉驼峰匹配,那么再通过queryUserById查询的结果中,用 ...
- Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField 关联关系字段 (Relationship fields)
ForeignKey,ManyToManyField与OneToOneField分别在Model中定义多对一,多对多,一对一关系. 例如,一本书由一家出版社出版,一家出版社可以出版很多书.一本书由多个 ...
- Django model 中的字段解释
Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需 ...
随机推荐
- React属性用法总结
1. 键值对 <ClaaNameA name = “Tom” /> <ClaaNameA name = {Tom} /> <ClaaNameA name = {“Tom” ...
- 专题训练之2-sat
推荐几篇博客:https://blog.csdn.net/JarjingX/article/details/8521690 研究总结2-sat问题 https://blog.csdn.net/wher ...
- PC蓝牙通信C#代码实现
PC蓝牙通信C#代码实现 这篇文章主要为大家详细介绍了PC蓝牙通信C#代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了C#实现PC蓝牙通信代码,供大家参考,具体内容如下 ...
- noip模拟赛 大芳的逆行板载
题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇想,在杆子上每1厘米为一个单 ...
- 二叉树中和为某一值得路径 java实现
本题来自<剑指offer> 路径为从根节点到叶节点一条路径,路径经过的各节点数值之和等于某一给定数值,则打印路径上的节点 因为需要打印满足条件的路径节点信息和各节点之和,需要栈记录经过的节 ...
- HTMLajax跨域向服务器写入数据
1.XMLHttpRequest升级版已经实现了跨域请求.不过需要在后台设置:header("Access-Control-Allow-Origin:http://www.a.com&quo ...
- stout代码分析之四:Try类
stout的在异常捕获上遵循于谷歌类似的原则,不适用try...catch...,而是从函数返回值判断异常.Try类正是实现了这样的一个功能. 同Option一样,Try是一个模板类,每个类对象都有两 ...
- bzoj 2457 [BeiJing2011]双端队列 模拟+贪心
[BeiJing2011]双端队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 457 Solved: 203[Submit][Status][D ...
- HDU1530 最大团 模板
Maximum Clique Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- C# 把类实例保存到文件里(类的序列化和反序列化)
有时候我们希望把类的实例保存下来,以便以后的时候用.一个直观的方法就是StreamWriter把类写成一行,用\t分隔开每个属性,然后用StreamReader读出来. 但是这样太麻烦,代码行数较多, ...