如何在 Django-admin 中呈现自定义嵌套复选框树视图?

2024-05-24

我有一个bugs映射到的模型categories。类别可以拥有其他类别。

class Bug( models.Model ):
    categories = models.ManyToManyField('Category')
    name = models.CharField( max_length=100 )
    slug = models.SlugField(unique=True)
    summary = models.TextField()
    summary_markdown = models.TextField(editable=False, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)
    browser = models.ManyToManyField( Browser )
    poster = models.ForeignKey(User)

class Category ( models.Model ):
    name = models.CharField( max_length=100 )
    slug = models.SlugField(unique=True)
    parent = models.ForeignKey( 'self', null=True, blank=True, related_name='children' )

    class Meta:
    ordering = ['name']
    verbose_name_plural = 'Categories'

    def __unicode__(self):
    return self.name

我已经在前端视图上使用 django-mptt 来渲染类别。我想知道如何修改管理视图,以便当我去创建新错误时,而不是非层次结构顺序的类别下拉列表,我会得到带有复选框而不是下拉列表的层次结构顺序。

就像是:

(checkbox) CSS
   (checkbox) Display
       (checkbox) Inline-block
       (checkbox) Block
   (checkbox) Float
   (checkbox) Height
       (checkbox) Min-height

我遇到了类似的问题,但使用的布局有点不同。您需要创建一个自定义小部件来显示类别。 这就是我的做法:

from itertools import chain

from django import forms
from django.db import models
from django.forms.widgets import CheckboxSelectMultiple
from django.utils.encoding import force_unicode
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe

class CustomCheckboxSelectMultiple(forms.CheckboxSelectMultiple):

    items_per_row = 1 # Number of items per row      

    def render(self, name, value, attrs=None, choices=()):
        if value is None: value = []
        has_id = attrs and 'id' in attrs
        final_attrs = self.build_attrs(attrs, name=name)
        output = ['<table><tr>']
        # Normalize to strings
        str_values = set([force_unicode(v) for v in value])
        for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
            # If an ID attribute was given, add a numeric index as a suffix,
            # so that the checkboxes don't all have the same ID attribute.
            if has_id:
                final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
                label_for = ' for="%s"' % final_attrs['id']
            else:
                label_for = ''           
                cb = forms.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
                option_value = force_unicode(option_value)
                rendered_cb = cb.render(name, option_value)
                option_label = conditional_escape(force_unicode(option_label))
                if i != 0 and i % self.items_per_row == 0:
                    output.append('</tr><tr>')
                #Here you need to put you layout logic for display the checkboxes 
                if self.choices[i][1].parent_id is None:
                    output.append('<td nowrap><label%s>%s</label></td>' % (label_for, option_label))
                else:
                    output.append('<td nowrap><label%s>%s %s</label></td>' % (label_for, rendered_cb, option_label))

        output.append('</tr></table>')       
        return mark_safe('\n'.join(output))

在 models.py 中我有:

class MyModelForm(ModelForm):
    my_model_types = forms.MultipleChoiceField(label='My model types', widget = CustomCheckboxSelectMultiple, required=True)

    class Meta:
        model = MyModel                     

    def __init__(self, *args, **kwargs):
        super(self.__class__, self).__init__(*args, **kwargs)
        tree = Tree()
        tree.build_tree(reasons=MyModelType.objects.all())
        list = tree.as_list()    
        CHOICES = [(rt.pk, rt) for rt in list]             
        self.fields['reason_types'].choices = CHOICES
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django-admin 中呈现自定义嵌套复选框树视图? 的相关文章

随机推荐

  • Scala 中的超时未来

    假设我有一个函数 它调用一个阻塞可中断的手术 我想在超时的情况下异步运行它 也就是说 我想在超时到期时中断该功能 所以我正在尝试做这样的事情 import scala util Try import scala concurrent Fut
  • 这个 SQL 语句在 Linq 中的等价物是什么?

    我需要将此 SQL 语句移植到 LINQ SELECT f ID as IdFlight Tarif 1 as Tarif f Time f TimeOfArrival sl Name as FromLoc sl Country as Fr
  • urllib2.urlopen() 创建的对象是否表示持续连接?

    在下面的代码中 与远程服务器的连接是否保持打开状态 直到close 被调用还是每次都重新创建read 叫做 在下面的代码中 我确实看到每次都会发生新的网络通信read 被调用 而不是远程文件一旦被缓冲urlopen 叫做 import ur
  • 原始 PDO 将 IOCTL 发送到上层过滤器驱动程序 (kbfiltr/moufiltr) 以启用/禁用设备

    我对驱动程序开发非常陌生 并尝试编写一个简单的过滤驱动程序来启用或禁用键盘或鼠标设备 如果我能让它工作 我想在插入鼠标时使用它来禁用笔记本电脑上的触摸板 我意识到可能已经有软件可以做到这一点 但我对设备驱动程序非常感兴趣并且想要自己学习如何
  • Qt:删除富文本

    对于明文有QFontMetrics elideText https doc qt io qt 5 qfontmetrics html elidedText https doc qt io qt 5 qfontmetrics html eli
  • 使用 Scala Slick 创建组合主键

    我正在尝试使用两列作为 Scala Slick 表的主键 这是我的表的定义方式 class NbaPlayerBoxScoreTable tag Tag extends Table NbaPlayerBoxScore tag player
  • 赋值运算符继承

    有这样的代码 include
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 使用 Windows 命令行将多行环境变量回显到文本文件

    我有一个环境变量 SSH PRIVATE KEY 并希望使用命令行将其打印到文件中 而不使用批处理文件 这是因为我需要在 Gitlab Ci yml 脚本中使用此文件 在 Linux 中 这很简单 echo SSH PRIVATE KEY
  • HTML - 如何在 HTML 页面上创建递增/递减文本框?

    How can i create a increment decrement text box in HTML Page using jquery or Javascript 我还想设置最大值和最小值 我该如何实现这个目标 简单的 HTML
  • 测量以指定宽度包裹的文本高度

    如何计算渲染以指定宽度包裹的文本所需的高度 我在中找到了以下方法Graphics graphicsObj MeasureString text font width 但它需要一个实例Graphics当时我还没有图形实例 事实上 我更喜欢使用
  • 有哪些扩展内置对象的有用 JavaScript 方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 扩展内置 JavaScript 对象 如字符串 数组 日期 布尔值 数学等 的最有用 最实用的方法是什么 String format
  • [node][mocha]使用 mocha 测试时无法访问全局变量

    我正在尝试为快速节点应用程序创建单元测试 我希望用于测试的配置与生产中使用的配置不同 因此我实现了以下内容 In my index js 我将配置加载到全局变量中 如下所示 global env global env config requ
  • 谁决定 Java 中数据类型的大小

    Java中int等数据类型的大小由谁决定 JVM 操作系统还是处理器 int 大小为 4 字节 无论操作系统或处理器如何 它总是 4 字节吗 The Java语言规范 http docs oracle com javase specs jl
  • android 想要导航到多个目的地吗?

    有什么办法可以导航到多个目的地吗 就像你可以在谷歌地图上做的那样 您可能知道 您可以使用以下未记录的方式导航到目的地 startActivity new Intent Intent ACTION VIEW Uri parse google
  • 返回承诺与在承诺内返回未定义之间的区别

    我不太确定我是否理解这两种常见场景之间的区别 假设我们有这个 user save then function val anotherPromise1 val then function val anotherPromise2 val cat
  • 从会话 0(服务)启动提升的用户进程[重复]

    这个问题在这里已经有答案了 大家早 这个问题似乎已被问过几次 但我找不到它是否真的可能 我已发布于here http social msdn microsoft com Forums windowsdesktop en US 80e4e75
  • 跨计算机共享 Eclipse 工作区?

    我需要设计或使用 5 到 10 台 PC 使用 Eclipse 但具有相同的工作空间 我该怎么做 我已经尝试过 但无法共享工作区的文件夹 请帮忙 实际上 你想实现什么目标 因为工作区应该是特定于用户的 它包含诸如设置 视角如何设置 哪个视图
  • 将字符串数组添加到组合框

    我有一个组合框 我想加载一个从方法返回的字符串数组 我目前只是用 for 循环加载它 但我认为应该可以将字符串数组直接分配给组合框 我只是想改进我的代码 我已经做了一些搜索 并且看到了使用数据范围或数据源的答案 但这些似乎都不起作用 我也尝
  • 如何在 Django-admin 中呈现自定义嵌套复选框树视图?

    我有一个bugs映射到的模型categories 类别可以拥有其他类别 class Bug models Model categories models ManyToManyField Category name models CharFi