zoukankan      html  css  js  c++  java
  • Django admin 自定义Choice_field

    在使用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的中文资料不多呀,官方文档倒是写得很详尽,但是英文文档找起东西来实在费劲。在这里记录下这个问题,以免后人再走弯路。

  • 相关阅读:
    [RK3288][Android6.0] U-boot 启动流程小结【转】
    学习笔记二十三——字符函数库cctype【转】
    【Git学习笔记】用git pull取回远程仓库某个分支的更新,再与本地的指定分支自动merge【转】
    Git 少用 Pull 多用 Fetch 和 Merge 【已翻译100%】【转】
    git 拉取和获取 pull 和 fetch 区别【转】
    setprecision、fixed、showpoint的用法总结(经典!!超经典!!)【转】
    Android休眠唤醒机制简介(二)
    获取元素个数的函数
    返回两个时间范围内的一个随机时间
    全角半角转换函数
  • 原文地址:https://www.cnblogs.com/yym2013/p/6294777.html
Copyright © 2011-2022 走看看