一、背景

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. 弱校的ACM奋斗史

    这是一篇老文章,不过由于无法找到最初的发文地址,这里就不能粘贴原文网址了.本站转载此文与ACMer们共勉.感谢acmerfight供稿. 题解:还记得2年前的一个晚上,我和一个女孩一起写完了这篇文章. ...

  2. BZOJ1832 聚会

    Description:Y岛风景美丽宜人,气候温和,物产丰富.Y岛上有N个城市,有N-1条城市间的道路连接着它们.每一条道路都连接某两个城市.幸运的是,小可可通过这些道路可以走遍Y岛的所有城市.神奇的 ...

  3. C++分离字符串中的数字和字符 转

    #include <iostream> #include <string> #include <vector> using namespace std; void ...

  4. mybatis生成的pojo 中的属性或方法不够我们当做dto使用时

    我们在写代码的时候,如果一个 mybatis生成的pojo 中的属性或方法不够我们使用(当做dto和前台交互)时,我们有两种方法: 第一: 直接在 原 pojo 中增加属性或者方法 第二:我们可以再写 ...

  5. UVA796:Critical Links(输出桥)

    Critical Links 题目链接:https://vjudge.net/problem/UVA-796 Description: In a computer network a link L, ...

  6. rand、randi和randn的区别?

    1,rand 生成均匀分布的伪随机数.分布在(0~1)之间 主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数 rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可 ...

  7. JS 中类型鉴别

    JS中的基本类型有:数字(Number(NaN,Infinity)),字符串(String),Undefined,Null,Boolean 引用类型有:数组(Array),对象(Object),函数( ...

  8. POJ 3281 最大流

    Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17251   Accepted: 7643 Descripti ...

  9. LightOJ 1023 Discovering Permutations 水题

    http://www.lightoj.com/volume_showproblem.php?problem=1023 题意:26字母全排列 思路:用next_permutation或者思维想一下都可以 ...

  10. LightOJ 1009 二分图染色+BFS/种类并查集

    题意:有两个阵营的人,他们互相敌对,给出互相敌对的人,问同个阵营的人最多有多少个. 思路:可以使用种类并查集写.也可以使用使用二分图染色的写法,由于给定的点并不是连续的,所以排序离散化一下,再进行BF ...