在使用Django Admin后台时,有时候想自定义某一字段的Choice_field,例如屏蔽某些选项,只显示某些指定的选项。

想象这样的应用场景,我有一个网站,导航栏是这样的:

点开“技术杂谈”后,显示成这样:

在这里,我在后台设计model时,将“技术杂谈”这种显示在导航栏的分类定义成一级分类,将“C/C++”、“Python”这种隐藏在折叠栏中的分类定义成二级分类,二级分类有一个字段存储有链接到对应的父分类的id号。

但这里出现了一个问题,我在后台创建文章时分类选项卡中显示成了这样:

一级分类和二级分类混杂到了一起,而我实际上只希望它显示二级分类。因为当选择“C/C++”、“python”这些二级分类时,会自动归类到对应的一级分类之中,所以没必要在选项卡里显示一级分类。

……

那么问题来了,如何在文章的分类选项卡中屏蔽掉一级分类呢?

我们需要修改文章的Model类,使用 ForeignKey.limit_choices_to 限制分类显示的内容,只显示符合条件的选项。

举个简单的例子,首先创建一个文章类:

class Article(models.Model):
title = models.CharField(max_length=50,verbose_name='文章标题')
content = models.TextField(verbose_name='文章内容')
category = models.ForeignKey(Category,blank=True,null=True,verbose_name='分类')

可以看出,category字段导入了外键Category。我们在ForeignKey函数中设置limit_choices_to参数:

class Article(models.Model):
title = models.CharField(max_length=50,verbose_name='文章标题')
content = models.TextField(verbose_name='文章内容')
category = models.ForeignKey(Category,blank=True,null=True,verbose_name='分类',limit_choices_to={'level':2})

limit_choices_to={'level':2}的意思是只显示分类等级为2的条目,即只显示二级分类。'level'是我在Category中定义的字段,用来代表该分类的等级,一般只有一级和二级。

总的来说,limit_choices_to的作用是设置筛选条件,在admin中只显示筛选后的内容

设置好这个参数,Django在后台就知道你要选择显示的内容了。

如此,在后台创建文章时就会发现分类表单中只有两个选项。

你也可以根据你的需要,显示你想要显示的选项。当然对其它字段自定义Choice_field也是一样的道理。

ps:一开始使用了choices参数设置显示内容,赋给它一个存储显示内容的元组,但是元组内容一直提示错误,遂查了不少资料,终于在官方文档里找到外键中limit_choices_to的使用方法。

附上ForeignKey.limit_choices_to官方文档链接:ForeignKey.limit_choices_to

  发现Django的中文资料不多呀,官方文档倒是写得很详尽,但是英文文档找起东西来实在费劲。在这里记录下这个问题,以免后人再走弯路。

Django admin 自定义Choice_field的更多相关文章

  1. django admin自定义

    django admin自定义 class CustomerAdmin(admin.ModelAdmin): list_display = ('id','name','qq','consultant' ...

  2. django admin 中实现word文档下载

    为了实现此功能,需要用到的知识点: (1)django  admin  自定义字段:   参考:http://www.cnblogs.com/wumingxiaoyao/p/6928297.html ...

  3. Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接

    在文章 Django实现自定义template页面并在admin site的app模块中加入自定义跳转链接(一) 中我们成功的为/feedback/feedback_stats/路径自定义了使用tem ...

  4. 自定义 Django admin 组件

    摘要:学习 Django admin 组件,仿照源码的逻辑,自定义了一个简易的 stark 组件,实现类似 admin 的功能. 可自动生成 url 路由,对于model 有与之相应的配置类对象,可进 ...

  5. Django之model admin自定义后台管理

    Admin管理界面是django的杀手级应用.它读取你模式中的元数据,然后提供给你一个强大而且可以使用的界面,网站管理者可以用它立即向网站中添加内容. 比如,数据表如下: from django.db ...

  6. Django admin美化插件suit应用[原创]

    前言 由于比较懒,自己弄了一个用户验证,没有自己写后台,用了django自带的user认证,并通过admin直接进行管理,但默认的admin并不漂亮,于是使用了这个django-suit插件,效果对比 ...

  7. Django admin 权威指南(一)

    版本: Django 1.10 此部分由官方文档<6.5.1 The Django admin site>翻译而来. 6.5.1.1 概览 默认情况下,使用startproject的时候, ...

  8. Django admin 显示图片

    我有一个表用来储存轮播图片,有一个 `picture` 字段储存的是图片的url,图片的 url 通过上传文件到 cdn 获得.目前这个表的编辑是通过自定义一个 `ModelForm`,然后重写 Dj ...

  9. Django Admin 简单部署上线

    前言 打算为公司弄一个管理公用密码的平台,由于比较懒,就选择使用Django admin,默认的admin并不漂亮,于是我使用了这个django-suit插件来美化 如图: 是不是比原来的漂亮多了. ...

随机推荐

  1. 反编译安卓apk以及jar包

    https://www.jianshu.com/p/c9b553cf2b51 https://blog.csdn.net/bzlj2912009596/article/details/78268896

  2. HTTP断点续传

    一.概述   所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Conten ...

  3. Egret EUI的学习

    官方地址:https://developer.egret.com/cn/article/index/id/518 官方案例:https://github.com/egret-labs/egret-ex ...

  4. Node回调&事件

    Node回调&事件 Node.js 异步编程的直接体现就是回调,异步编程依托于回调来实现 简介 回调函数在任务完成后会被调用,node的所有API都支持回调函数,回调函数提高了Node的性能, ...

  5. Python内置模块的几点笔记

    1.shutil模块 import shutil shutil.make_archive('shutil_archive_test', 'zip', 'D:\pyworkspace\.idea') m ...

  6. Maven实战(八)——常用Maven插件介绍(下)

    我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的.进一步说,每个任务对应 ...

  7. JQ02

    JQ02 1.css操作 .css(属性名,属性值)://要有双引号 修改单个样式,若要修改多个,需采用以下方式: 以对象为参数 它还可以获取样式: .css("属性名") 若元素 ...

  8. DBS-Function:f_GetPy

    ylbtech-SQL Server-Function:f_GetPy   A, 返回顶部 1.f_GetPy )) ) as begin ) ) collate Chinese_PRC_CI_AS, ...

  9. Activity class {com.../com....MainActivity} does not exist.

    报错信息如上图所示,解决步骤: 1. 首先是检查这个MainActivity.java是不是真的存在,且包名和路径无误: 2. 如果文件存在,且包名和路径没有问题,那么就打开你项目所在的/androi ...

  10. python接口自动化测试(四)-Cookie&Sessinon

    掌握了前面几节的的内容,就可以做一些简单的http协议接口的请求发送了,但是这些还不够.HTTP协议是一个无状态的应用层协议,也就是说前后两次请求是没有任何关系的,那如果我们测试的接口之前有相互依赖关 ...