一、背景

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. [Leetcode] single number 找单个数

    Given an array of integers, every element appears twice except for one. Find that single one. Note:  ...

  2. httpClient需要的jar包

  3. HDU4009:Transfer water(有向图的最小生成树)

    Transfer water Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others)To ...

  4. C++智能指针 auto_ptr

    C++智能指针 auto_ptr auto_ptr 是一个轻量级的智能指针, 定义于 memory (非memory.h)中, 命名空间为 std. auto_ptr 适合用来管理生命周期比较短或者不 ...

  5. rm删除破折号 - 开头的文件

    解决这个问题的一个方法就是在要删除的文件的前边加上"./" # rm ./-slow_query_130103.txt.gz To remove a file whose name ...

  6. C#学习之自定义数组及其排序

    在C#中对数组的定义比较灵活.这里着重说一下自定义数组和Array类的排序. 在Array类中通过属性Length就可以获取整个数组中数据的数量,可以通过foreach迭代数组. 使用Rank属性可以 ...

  7. ACM2066

    题目原址:http://acm.hdu.edu.cn/showproblem.php?pid=2066 大神必须飘过,我在这个题目里面学到了太多太多了.我提交了十六次,错了十二次,反复了这么久才解决内 ...

  8. ClusterId read in ZooKeeper is null 处理

    ClusterId read in ZooKeeper is null. Re-running the program after fixing issue 1 will result in the ...

  9. Java并发之同步原语

    volatile: 定义:Java编程语言允许线程访问共享变量,为了确保共享变量内被准确和一致性地更新,线程应该确保通过排它锁单独获得这个变量.根据volatile的定义,volatile有锁的语义. ...

  10. sublime 常用插件 感觉比较全了 够用了

    插件介绍 Package Control 功能:安装包管理 简介:sublime插件控制台,提供添加.删除.禁用.查找插件等功能 使用:https://sublime.wbond.net/instal ...