django中的admin组件之自定义组件的数据展示以及自定义列

虽然我们基本实现了我们自定义组件stark的功能,接下来就是显示数据了。

今天我们先来写查。先来写表单部分

我们如果需要显示我们自己配置类中的字段,应该怎么做呢?

我们有这样一个想法,将这些数据放在一个列表中,类似这样[[‘python’,122],[‘linux’,110]],然后在页面上依次循环这个列表,取值就行了。

self.model.objects.all()中里面有我们需要的对象,self.list_display中有我们需要的字段。所以:

 def listview(self,request):
        # print(self)# 当前访问摩星表的配置类对象
        # print(self.model)# 当前访问的模型表
        data_list = self.model.objects.all()  # 取到所有的对象 [‘python‘,‘linux‘]# 构建数据表单部分
        new_data_list = []
        for obj in data_list:
            temp = []
            for field in self.list_display: # [‘price‘,‘title‘]
                val = getattr(obj,field)  # getattr通过字符串取值
                temp.append(val)  # [‘python‘,‘100‘]  [‘linux‘,‘120‘]
            new_data_list.append(temp) # [[‘python‘,‘100‘],[‘linux‘,‘120‘]]
        return render(request,‘list.html‘,locals())

在页面上我们这样获取数据:

<table class="table table-hover">
                        <thead>
                        <tr></tr>
                        </thead>
                        <tody>
                            {% for data in new_data_list %}
                                <tr>
                                    {% for item in data %}
                                        <td>{{ item }}</td>
                                    {% endfor %}
                                </tr>
                            {% endfor %}
                        </tody>
                    </table>

但是这里面有一个bug,因为我们是以book为例 的,book是我们自己写的配置类,所以list_display中有我们写的字段,但是当我们访问publish的时候,publish用的是默认的配置类,list_display里面是没有字段的,所以在  for field in self.list_display: # [‘price‘,‘title‘]    这一步出错。所以我们应该在最前面定义一个list_display = [‘__str__‘],如果使用的是默认的配置类,就让他执行__str__方法。

我们都知道,在admin组件中,我们自己定义的配置类中,list_display中是可以放一对多字段,但是不能放多对多字段,,所以在我们写的自定义组件中,也同样不能放多对多字段,那我们就像显示多对多的字段,该怎么做呢?

这里先说一个知识点:我们之前介绍过在我们自己写的组件中,

model_name = self.model._meta.model_nameapp_label = self.model._meta.app_label这两种方法可以获得当前表的名字和当前app的名字。在介绍一种field_obj = self.model._meta.get_field(field)这种方法能够取到表中具体的某一字段对象。所以我们想要放多对多字段之前,先进行判断,
    def listview(self,request):
        # print(self)# 当前访问摩星表的配置类对象
        # print(self.model)# 当前访问的模型表
        data_list = self.model.objects.all()    # 构建数据表单部分
        new_data_list = []
        for obj in data_list:
            temp = []
            for field in self.list_display: from django.db.models.fields.related import ManyToManyField
                 field_obj = self.model._meta.get_field(field) # 获取表中某个字段
                 if isinstance(field_obj,ManyToManyField): # 判断field_obj字段是否属于多对多字段
                     many_data_list = getattr(obj, field).all()  # 如果是多对多字段,book.author.all()取到所有作者对象
                      item = [str(item) for item in many_data_list]
                      val = ‘,‘.join(item)
                 else:# 如果不是多对多字段,获取值
                      val = getattr(obj,field)
                 temp.append(val)
            new_data_list.append(temp)

   return render(request,‘list.html‘,locals())

这样就行了。这样表单中的数据就处理完了。接下来我们来写表头部分。

我们想表头部分不就是在list_display中吗?直接在页面中循环不就行了吗。这样固然没错,但是这样渲染出来的表头是英文的,我们想要中文的怎么做?

def listview(self,request):
        # print(self)# 当前访问摩星表的配置类对象
        # print(self.model)# 当前访问的模型表
        data_list = self.model.objects.all()
        # 构建表头部分
        header_list=[]
        for field in self.list_display:  # 循环每一个字段,if field == ‘__str__‘:    # 判断field是__str__,说明使用的是默认配置类,将表头就定为表的名字
                val = self.model._meta.model_name
            else:  # 否则说明使用的自定义配置类,
                obj = self.model._meta.get_field(field) # 得到自定义配置类的字段对象,
                val = obj.verbose_name   # 获取字段的verbose_name,verbose_name是models中每一个字段的可设置的参数
            header_list.append(val)
     # 构建数据表单部分
        new_data_list = []
        for obj in data_list:
            temp = []
            for field in self.list_display: from django.db.models.fields.related import ManyToManyField
                 field_obj = self.model._meta.get_field(field) # 获取表中某个字段
                 if isinstance(field_obj,ManyToManyField): # 判断field_obj字段是否属于多对多字段
                     many_data_list = getattr(obj, field).all()  # 如果是多对多字段,book.author.all()取到所有作者对象
                      item = [str(item) for item in many_data_list]
                      val = ‘,‘.join(item)
                 else:# 如果不是多对多字段,获取值
                      val = getattr(obj,field)
                 temp.append(val)
            new_data_list.append(temp)
return render(request,‘list.html‘,locals())

在页面中,

             <table class="table table-hover">
                        <thead>
                        <tr>
                            {% for header in header_list %}
                                <th>{{ header }}</th>
                            {% endfor %}
                        </tr>
                        </thead>
                        <tody>
                            {% for data in new_data_list %}
                                <tr>
                                    {% for item in data %}
                                        <td>{{ item }}</td>
                                    {% endfor %}
                                </tr>
                            {% endfor %}
                        </tody>
                    </table>                

这样表头就完了。

接下来我们写自定义列

我们在查看书籍的时候肯定够编辑和删除对不对,所以我们要在表头加一列:操作。这该怎么做,

添加操作当然要在自定义配置类中的list_display中添加操作,list_display = ["title", "price", "publish",‘authors‘,edit,delete]:

# 定义自己的配置类
class Bookconfig(sites.ModelAdmin):
    def edit(self,obj=None,is_header=False):
        if is_header:
            return ‘操作‘
        else:
            return mark_safe("<a href=‘/stark/app01/book/%s/change/‘>编辑</a>"%obj.pk)
    def delete(self,obj=None,is_header=False):
        if is_header:
            return ‘操作‘
        else:
            return mark_safe("<a href=‘/stark/app01/book/%s/delete/‘>删除</a>" % obj.pk)

    #  list_display‘ must not be a ManyToManyField.
    list_display = ["title", "price", "publish",‘authors‘,edit,delete]
sites.site.register(models.Book,Bookconfig)

那么在视图函数中怎么用呢?

上面涉及到的知识点:



原文地址:https://www.cnblogs.com/yb635238477/p/9557718.html

时间: 2024-10-01 06:42:16

django中的admin组件之自定义组件的数据展示以及自定义列的相关文章

易宝典——玩转O365中的EXO服务 之四十三 就地电子数据展示存在什么样的搜索限制和局限

企业发现管理员在操作电子数据展示和保留时,往往会遇到诸如"包括不可搜索的项目"等选项.这种不可搜索项目是由于Exchange Online不支持的文件类型或其它原因产生的.那么到底Exchange Online对其就地电子数据展示搜索存在哪些限制和局限性呢? 一.就地电子数据展示的搜索限制 就地电子数据显示的限制有助于维护Office 365服务的运行的状况和质量.一般作为Office 365的订阅者是无法修改这些限制,通过了解这些限制,可以在规划.运行电子数据展示搜索,以及排除故障时

django中的admin组件之自定义组件

内容回顾: 一 admin的使用 app01的admin.py文件:                  class BookConfig(admin.ModelAdmin):               list_display=[]               list_display_links=[]               list_filter=[]               search_fields=[]                              def pat

django中的admin组件之自定义组件的增删改查的完善

昨天我们将自定义列放在类我们自定义的Bookconfig配置类内,但是这样就写死了,因为当我们访问publish表的时候应该也有这样的自定义列,所以我们应该将我们的自定义列放在默认的配置表里面.应该怎么做? 当我们的自定义列挪到默认配置类的时候,我们自定义配置类中的list_display就要发生改动, list_display = ["title", "price", "publish",'authors','publishDate',site

Django中的Admin站点

使用Admin站点 假设我们要设计一个新闻网站,我们需要编写展示给用户的页面,网页上展示的新闻信息是从哪里来的呢?是从数据库中查找到新闻的信息,然后把它展示在页面上.但是我们的网站上的新闻每天都要更新,这就意味着对数据库的增.删.改.查操作,那么我们需要每天写sql语句操作数据库吗? 如果这样的话,是不是非常繁琐,所以我们可以设计一个页面,通过对这个页面的操作来实现对新闻数据库的增删改查操作.那么问题来了,老板说我们需要在建立一个新网站,是不是还要设计一个页面来实现对新网站数据库的增删改查操作,

Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespace是定义命名空间,比如下面这种配置, urlpatterns = [ #课程机构url配置,验证码,每个app可以书写自己的url,然后通过include进来 url(r'^org/', include('oraganization.urls',namespace="org")), ] 2

django中的admin组件之自定义组件的search,actions,list_display_links

上节回顾:                               1 反向解析(reverse)                2 modelForm--->添加和编辑                                        添加:                        class BookModelForm():                             class Meta:                                  

Django中的tags,母版和继承,组件,静态文件相关,自定义simpletag和自定义inclusion_tag

Tags for <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul> for循环可用的一些参数: Variable Description forloop.counter 当前循环的索引值(从1开始) forloop.counter0 当前循环的索引值(从0开始) forloop.revcounter 当前循环的倒序索引值(从1开始) forloop.rev

django中的Admin是如何工作的?

1.寻找app的 admin.py 当服务启动时,Django从`` url.py`` 引导URLconf,然后执行`` admin.autodiscover() 语句. 这个函数遍历INSTALLED_APPS配置,并且寻找相关的 admin.py文件. 如果在指定的app目录下找到admin.py,它就执行其中的代码. url.py----(admin.autodiscover)---->INSTALLED_APP----(寻找安装的app)---->admin.py 2.注册模块显示界面

Django中ORM多对多表的操作

自己创建第三张表建立多对多关系 表的创建 # 老师表和学生表可以是一个多对多的关系,建表时可以手动建立第三张表建立关联 class Student(models.Model): name = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) class Teacher(models.Model): name = models.CharField(max_lengt