Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >django admin 对 list_filter 排序

django admin 对 list_filter 排序

作者头像
卓越笔记
发布于 2023-02-18 02:49:55
发布于 2023-02-18 02:49:55
51300
代码可运行
举报
文章被收录于专栏:卓越笔记卓越笔记
运行总次数:0
代码可运行

参考文档

1. https://cloud.tencent.com/developer/ask/34273

2. https://djangosnippets.org/snippets/2885/

3. https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

4. https://blog.csdn.net/kkevinyang/article/details/79501576

models.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.db import models
from django.db.models.signals import post_save
from django.contrib.auth import get_user_model
from django.template.defaultfilters import slugify

from DjangoUeditor.models import UEditorField
from pyquery import PyQuery as pq  # pip install pyquery,获取到html中的img图片地址返回
from pypinyin import lazy_pinyin

User = get_user_model()


# Create your models here.

class Node(models.Model):
    """
    节点表
    """
    name = models.CharField(max_length=128, unique=True, verbose_name="节点名称")

    # SlugField 是一个新闻术语(通常叫做短标题)。一个 slug 只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。通常它们是用来放在地址栏的URL里的。
    # 像 CharField一样,你可以指定 max_length(也请参阅该部分中的有关数据库可移植性的说明和 max_length)。如果没有指定
    # max_length, Django将会默认长度为50。
    # 将Field.db_index设置为True。
    # 根据某些其他值的值自动预填充SlugField通常很有用。你可以在admin中使用 prepopulated_fields 自动执行此操作。
    slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
    num_topics = models.IntegerField(default=0, verbose_name="主题数量")
    category = models.ForeignKey(Category, verbose_name="所属类别")
    is_show = models.BooleanField(default=True, verbose_name="显示状态")

    def save(self, *args, **kwargs):
        self.slug = slugify("-".join(lazy_pinyin(self.name)))
        super(Node, self).save(*args, **kwargs)

    class Meta:
        verbose_name = "节点"
        verbose_name_plural = "节点列表"

    def __str__(self):
        return self.name


class Article(models.Model):
    """
    主题表/文章表
    """
    title = models.CharField(max_length=128, verbose_name="标题")
    slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符")
    content = UEditorField(verbose_name="内容", imagePath="blog/images/", width=1000, height=300,
                           filePath="blog/files/", default='')
    node = models.ForeignKey(Node, verbose_name="所属节点")
    user = models.ForeignKey(User, related_name="user_article", verbose_name="作者")
    source = models.ForeignKey(Source, verbose_name="来源", blank=True, null=True)
    tags = models.ManyToManyField(Tag, verbose_name="标签", related_name="tags_article", blank=True)
    num_views = models.IntegerField(default=0, verbose_name="浏览数量")
    num_favorites = models.IntegerField(default=0, verbose_name="收藏数量")
    last_answerer = models.ForeignKey(User, related_name="last_answerer_article", verbose_name="最后回复者", blank=True,
                                      null=True)
    is_show = models.BooleanField(default=True, verbose_name="显示状态")
    create_time = models.DateTimeField(auto_now_add=True, verbose_name="发表时间")
    update_time = models.DateTimeField(blank=True, null=True, auto_now=True, verbose_name="更新时间")

    def save(self, *args, **kwargs):
        self.slug = slugify("-".join(lazy_pinyin(self.title)))
        super(Article, self).save(*args, **kwargs)

    # 获取后台文本编辑器图文内容中图片url地址
    def get_content_img_url(self):
        temp = Article.objects.filter(pk=str(self.id)).values('content')  # values获取Article数据表中的content字段内容
        html = pq(temp[0]['content'])  # pq方法获取编辑器html内容
        # print(html, "\n", "----")
        img_path = pq(html)('img').attr('src')  # 截取html内容中的路径
        # print("pic", img_path)
        return img_path  # 返回第一张图片路径

    class Meta:
        verbose_name = "文章"
        verbose_name_plural = "文章列表"

    def __str__(self):
        title_short = self.title if len(self.title) < 15 else self.title[:12] + '...'
        return "%s %s %s" % (self.id, self.user, title_short)

admin.py 

NodeFilter 主要步骤:

1. 继承 SimpleListFilter

2. 修改 lookups,lookups 用来显示在网页上的筛选条件

3. 修改 queryset,根据传进来的值来返回查询结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.contrib import admin
from django.forms import widgets
from apps.blog.models import *
from apps.blog.forms import ArticleAdminForm
from django.contrib.admin import SimpleListFilter


class NodeFilter(SimpleListFilter):
    title = 'node'  # or use _('country') for translated title
    parameter_name = 'node'

    def lookups(self, request, model_admin):
        # 查出 node 的 id 和 name 值 用来显示在网页上的筛选条件
        nodes = Node.objects.all()
        return [(node.id, node.name + "-自定义") for node in nodes]

    def queryset(self, request, queryset):
        if self.value():
            # 筛选条件有值时, 查询对应的 node 的文章,用 title 正排序
            return queryset.filter(node__id=self.value()).order_by("title")
        else:
            # 筛选条件没有值时,全部的时候是没有值的
            return queryset


class ArticleAdmin(admin.ModelAdmin):
    form = ArticleAdminForm  # 指定了表单,就不要再用 formfield_overrides 了

    list_display = ['id', 'thumb_shouw', 'title', 'node', 'num_views', 'show_status', 'slug', 'user', 'time_create']
    list_display_links = ['id', 'thumb_shouw', 'title', 'node', 'num_views', 'user']
    list_filter = ['id', 'source__name', NodeFilter]  # 把自己的筛选添加加进来
    search_fields = ['title_short', 'user', 'content']
    list_editable = ["show_status", ]
    # style_fields = {"content": "ueditor"}
    readonly_fields = ('slug',)
    show_detail_fields = ['show_status', ]

效果

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-9-25 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
django admin 给 字段 增加 HTML 样式(显示图片、设置字体颜色、超链接、按钮等)
django admin 后台样式默认情况下都是默认的样式,有时候我们需要在 admin 显示一张图片、或者更改一个文案的显示颜色等等,该怎办呢?
卓越笔记
2023/02/18
3K0
django admin 给 字段 增加 HTML 样式(显示图片、设置字体颜色、超链接、按钮等)
django admin list_filter 显示外键字段
models.py class Node(models.Model): """ 节点表 """ name = models.CharField(max_length=128, unique=True, verbose_name="节点名称") # SlugField 是一个新闻术语(通常叫做短标题)。一个slug只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。通常它们是用来放在地址栏的URL里的。 # 像CharField一样,你可以指定max_
卓越笔记
2023/02/18
1K0
django 获取富文本编辑器中的图片地址(缩略图、封面)
开发环境   1. python: 3.6.8   2. django==1.11.22 models.py from django.db import models from django.db.models.signals import post_save from django.contrib.auth import get_user_model from DjangoUeditor.models import UEditorField from pyquery import PyQuery as
卓越笔记
2023/02/18
6220
django import_export 个性化可视化导出外键字段
models.py class Article(models.Model): """ 主题表/文章表 """ title = models.CharField(max_length=128, unique=True, verbose_name="标题", help_text="请填写标题") slug = models.SlugField(max_length=128, unique=True, verbose_name="url标识符") content =
卓越笔记
2023/02/18
7860
Django admin 多对多字段 过滤方法 及 保持横向显示(穿梭框)
在 admin 中,文章的 tags 字段选择的时候可以按 Tag 的 show_status 过滤,并且保持横向展示
卓越笔记
2023/02/18
1.4K0
django admin 实现 增加记录 和 修改记录 展现不同的表单
提供一个参考,具体逻辑要看具体情况。本质就是根据条件展示不同的表单内容(注意表单必填项字段,保存时要记得传值)。
卓越笔记
2023/02/18
1.2K0
django 自动设置 SlugField 字段
首先我们要了解 django 字段类型 SlugField,SlugField 是一个新闻术语(通常叫做短标题)。一个 slug 只能包含字母、数字、下划线或者是连字符,通常用来作为短标签。通常它们是用来放在地址栏的 URL 里的。像 CharField 一样,你可以指定 max_length(也请参阅该部分中的有关数据库可移植性的说明和 max_length)。如果没有指定 max_length, Django 将会默认长度为 50。
卓越笔记
2023/02/18
9750
django annotate 分组统计
使用提供的 查询表达式 Annotate 查询集中的每个对象。查询表达式可以是一个简单的值、模型(或关联模型)字段的一个引用或对查询集中的对象一个聚合函数(平均值、和等)。
卓越笔记
2023/02/18
9020
Django开发网页计数器统计页面浏览次数
实际Web开发过程中,我们经常要统计并显示一个页面的浏览次数。今天我们会以博客的例子,教你如何利用Django开发网页计数器,统计并显示一篇文章的浏览次数。本文的原理可以适用于很多场景,比如统计某一文件的下载次数,统计某一用户在单位时间内的登录次数。本文使用Django 2.0 + Python 3.X实现。
菲宇
2019/06/13
2.2K0
Django开发网页计数器统计页面浏览次数
BBS项目(二)
目录 BBS项目(二) ORM 创建相关表 表模型 修改admin样式 Simple-UI 注册表添加数据 注册forms类编写 注册功能前端搭建 头像实时显示功能实现 BBS项目(二) 可以在本地写或虚拟环境 添加虚拟环境 如果虚拟环境启动报错:解决 query = query.decode(errors=‘replace‘) AttributeError: ‘str‘ object has no attribute ‘decode‘ 解决办法 query = query.decode(erro
HammerZe
2022/03/24
8140
BBS项目(二)
超越村后端开发(2:新建models.py+xadmin的引入)
1.新建Model 1.users数据 1.在apps/users/models.py中: from datetime import datetime from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class UserProfile(AbstractUser): """ 管理员 """ name=mod
玩蛇的胖纸
2019/04/09
5170
超越村后端开发(2:新建models.py+xadmin的引入)
Django学习_简易博客(二)
项目:基于某些设置项的Django安装结果; 应用程序:模型,视图,模版,URL的组合 应用程序和框架进行交互,并提供特定的功能,并可以在不同的项目中加以复用。 创建项目 $ python manag
zx钟
2019/07/18
6650
django admin 给字段设置 widget
* 本文代码同步更新至 https://github.com/yinzhuoqun/django2 *
卓越笔记
2023/02/18
1.2K0
django admin 给字段设置 widget
Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用
 在django中,有一个记录了项目中所有model元数据的表,就是ContentType,表中一条记录对应着一个存在的model,所以可以通过一个ContentType表的id和一个具体表中的id找到任何记录,及先通过ContenType表的id可以得到某个model,再通过model的id得到具体的对象。
用户1214487
2022/03/26
4.5K0
Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用
Django-model进阶(中介模型,查询优化,extra,整体插入)
QuerySet 可切片 使用Python 的切片语法来限制查询集记录的数目 。它等同于SQL 的LIMIT 和OFFSET 子句。 1 >>> Entry.objects.all()[:5]      # (LIMIT 5) >>> Entry.objects.all()[5:10] # (OFFSET 5 LIMIT 5) 不支持负的索引(例如Entry.objects.all()[-1])。通常,查询集 的切片返回一个新的查询集 —— 它不会执行查询。 可迭代 ar
用户1214487
2018/01/24
1.7K0
【Python全栈100天学习笔记】Day41 Django深入理解框架
在上一个章节中,我们提到了Django是基于MVC架构的Web框架,MVC架构追求的是“模型”和“视图”的解耦合。所谓“模型”说得更直白一些就是数据(的表示),所以通常也被称作“数据模型”。在实际的项目中,数据模型通常通过数据库实现持久化操作,而关系型数据库在过去和当下都是持久化的首选方案,下面我们以MySQL为例来说明如何使用关系型数据库来实现持久化操作。
天道Vax的时间宝藏
2022/04/02
2.4K0
【Python全栈100天学习笔记】Day41 Django深入理解框架
django搭建BBS-表单创建&注册
django搭建BBS-表单创建&注册 0824自我总结 文件结构 app 接口 migrations __inint__.py admin.py 管理员页面注册表单用 apps.py bbsform.py form组件相关设置 models.py 模型存放 tests.py views.py 业务逻辑 avatar 图片文件存储 BBS 项目名称以及路由存放 __inint__.py settings.py urls.py wsgi.py static bootstrap-3.3.7-dist bo
小小咸鱼YwY
2019/09/11
1.7K0
测试开发进阶(三十四)
数据库模型图 创建app 根据上面的数据库设计,创建9个app configures debugtalks envs interfaces projects reports testsuits tes
zx钟
2019/11/07
5110
测试开发进阶(三十四)
django2实战2.创建博客应用创建应用文章表的字段设计激活应用开启后台将post模型注册到后台自定义文章显示字段增加可选操作
上篇创建了一个项目,项目相当于站点,应用即是独立的功能模块。比如:淘宝是一个完整的网站,即是一个项目。而淘宝下的聚划算属于一个应用
章鱼喵
2018/09/26
1.1K0
django2实战2.创建博客应用创建应用文章表的字段设计激活应用开启后台将post模型注册到后台自定义文章显示字段增加可选操作
Django学习笔记之利用Form和Ajax实现注册功能
一、注册相关的知识点 1、Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2
Jetpropelledsnake21
2018/07/04
9240
推荐阅读
相关推荐
django admin 给 字段 增加 HTML 样式(显示图片、设置字体颜色、超链接、按钮等)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档