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:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需 ...
随机推荐
- 洛谷 P1311 选择客栈 解题报告
P1311 选择客栈 题目描述 丽江河边有 \(n\) 家很有特色的客栈,客栈按照其位置顺序从 \(1\) 到 \(n\) 编号.每家客栈都按照某一种色调进行装饰(总共 \(k\) 种,用整数 \(0 ...
- bzoj2588: Spoj 10628. Count on a tree(树上第k大)(主席树)
每个节点继承父节点的树,则答案为query(root[x]+root[y]-root[lca(x,y)]-root[fa[lca(x,y)]]) #include<iostream> #i ...
- Semphore信号量的使用
前言:在多线程环境的同步中,我们为了让每个线程具有同步的作用,经常采用synchronize.reetrantlock等同步手段进行上锁,以便在同一时间只能有一个线程具有访问变量和读写变量的权力.然而 ...
- JavaScript去除空格trim()的原生实现
W3C那帮人的脑袋被驴踢了,直到javascript1.8.1才支持trim函数(与trimLeft,trimRight),可惜现在只有firefox3.5支持.由于去除字符串两边的空白实在太常用,各 ...
- Extjs 动态修改gridPanel列头信息以及store数据的方法
1 /*******************************checkbox按钮 历史报警信息**************************************/ var check ...
- HDU4685:Prince and Princess(二分图匹配+tarjan)
Prince and Princess Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Othe ...
- [技巧篇]13.从今天开始做一个有理想的人,放弃alter的调试,拥抱console.log
在js前端开发时,为了调试经常会加上 console.log.但是在有的浏览器(比如IE)中会报错,怎么办呢?好像10之后也开始支持了!如果以防方一,可以使用如下方式 在js文件最前面添加如下js代码 ...
- Eclipse srever起来时,时间超过45s。
双击servere的名字,在属性界面上进行修改. 如下图: 修改TimeOut中的值即可.
- 51Nod 1095 Anigram单词 | Hash
Input示例 5 add dad bad cad did 3 add cac dda Output示例 1 0 2 题意:一系列字符串,查询字符串S,能通过其他字符串交换串内字符顺序得到的字符串个数 ...
- web开发中防止SQL注入
一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库. 二.SQL注入攻击的总体 ...