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字段名称

原文地址:https://www.cnblogs.com/supery007/p/8638377.html

时间: 2024-10-03 14:44:58

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

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

之前写过这样一个model: class MonthlyFeeMember(models.Model): worker = models.ForeignKey(Student, verbose_name=u"主检查人", related_name="as_monthly_fee_members") month = models.CharField(u'检查月份', max_length=10, default=get_current_month()) check_d

如何获取和复制表中所有字段名称

说明: 在SQL SERVER数据实际的使用过程中,我们经常需要用到某张表的所有字段.如何一次性在最短时间.最方便地获取这些字段名称,是提高工作效率的一种必不可少的方法. 在这里,简单地根据自己的实际应用和体会,汇总下两种方法,进攻参考! 方法一:通过SQL自带工具实现. 通过数据库查询管理工具设置实现,下面例子为SQL Server 2005数据库. 第一步.设置:工具-选项-查询结果-SQL Server-以文本格式显示结果.在“输出格式”选择”逗号分隔“.如下图: 第二步.在数据库查询分析

Django model 中的字段解释

Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField:一个自动递增的整型字段,添加记录时它会自动增长.你通常不需要直接使用这个字段:如果你不指定主键的话,系统会自动添加一个主键字段到你的model.(参阅自动主键字段) BooleanField:布尔字段,管理工具里会自动将其描述为checkbox. CharField:字符串字段,单行输入,用于较短的字符串,如要保存大量文本, 使用 TextField,Ch

数据库小记:根据指定名称查询数据库表名及根据指定名称查询数据库所有表中的字段名称(支持mysql/postgre)

意:本篇文章仅适用于mysql和postgre这两种数据库 1.查询数据库中所有表名及对应表的详细信息 select * from INFORMATION_SCHEMA.tables 2.根据指定名称查询表名(也可模糊查询,可查询表的详细信息) select *  from INFORMATION_SCHEMA.tables where table_name = 'eguid'; select * from INFORMATION_SCHEMA.tables where table_name l

Django将从数据库中获取到数据转换为dict

这种方式只能应用于从数据库中获取到的单条数据,例如models.Users.objects.get()获取到的数据 from django.forms.models import model_to_dict class Index(VIew): def get(self, request): userObj = models.Users.objects.get(id = 1) userDict = model_to_dict(userObj) print(userDict) return Htt

Java获取类或对象中的字段名称和JsonProperty注释的名称

创建一个模型如下: package model; import com.fasterxml.jackson.annotation.JsonProperty; public class ProvNode { @JsonProperty("machineId") private String nodeId; private String name; private String result; private String status; @JsonProperty("messa

Ubuntu中获取文件名称,并生成列表txt

为了测试caffe,准备了一堆图片准备测试.前面进行了重命名的操作准备,现在需要将文件名全部读取出来生成txt作为标签使用.此过程用到了find命令和sed命令. 先看效果图 当然还有后续处理,就是在所有文件名后打上标签序号,这个就是sed命令的作用了,此处我也做成了sh文件,方便使用,代码如下,自行参考修改使用吧. > 自己写的create_filelist.sh文件,如下 train_file=test.txt path=train/test find $path -name *.jpg >

django中的字段、字段参数、orm操作、QuerySet相关方法:

常用字段  AutoField 自增的整形字段,必填参数primary_key=True,则成为数据库的主键.无该字段时,django自动创建. 一个model不能有两个AutoField字段. IntegerField 一个整数类型.数值的范围是 -2147483648 ~ 2147483647. CharField 字符类型,必须提供max_length参数.max_length表示字符的长度. DateField 日期类型,日期格式为YYYY-MM-DD,相当于Python中的dateti

Django model 中meta options之 abstract

当abstract=True时,这个model就变成了abstrct base class,那这个基类有什么特性呢? 当某一model中设置了abstract=True时,就会使该model中的字段都不会产生对应的表,而是可以作为基类加入到其他model中 那有什么用呢? 有时多个model有些相同的字段,这样很浪费时间,而且重复本身也不利于代码简洁.好该abstract来了 看官例: from django.db import models class CommonInfo(models.Mo