繁体   English   中英

如何从Django管理员中删除多余的选择?

[英]How to remove redundant choices from django admin?

我正在编写django应用程序以管理页面上的静态内容,以便最终用户可以在不更改代码服务器端的情况下始终更新内容。 这部分意味着跟踪哪些部分具有自定义定义。 因此,这些部分是我的应用程序模型之一。 问题是我想限制关于可以自定义哪些部分的选择。

以下是部分内容:

from django.db import models

# Create your models here.
CHOICES = (
    ("Media_Music_Description","Media Page - Music Description"),
    ("Media_Photos_Description","Media Page - Photos Description"),
    ("Media_Videos_Description","Media Page - Videos Description"),
    ("Home_Content", "Home Page - Content"),
    ("About_Content", "About Page - Content")
)

class StaticItem(models.Model):
    location = models.CharField(choices=CHOICES, unique=True, max_length=255)

    def __unicode__(self):
        return self.category


class ContentBlock(models.Model):
    rank = models.SmallIntegerField()
    parent = models.ForeignKey('StaticItem')
    content = models.TextField(max_length=1024)

    def __unicode__(self):
        return "%s - %d" % (self.parent.location, self.rank)

最后,我将CHOICES定义移到我的设置文件中。 但是,目前的问题是,即使StaticItem模型具有由这些选项确定的唯一字段,当创建新的StaticItem时,所有选项都将显示在管理面板下拉菜单中。 当它们显示为选项时,django阻止用户创建其位置已被另一个用户使用的StaticItem 那么我的问题是如何只显示从选项CHOICES还没有被使用的一个StaticItem呢。 基本上,两者之间必须存在1对1的关系,但是我遇到了问题,因为我不想将CHOICES作为模型。

我将在StaticItem中创建一个类方法,该方法类似于:

def choices_available(self):
    # query the choices that have been used in StaticItem into "used"
    return [c for c in choices if c is not in used]

然后,使用StaticItem.choices_available()的结果填充您的管理页面字段。

附带说明:将CHOICES定义放在StaticItem类而不是您所拥有的模块范围内是一种常规且更清洁的方法。

您需要使用对StaticItem的动态选择来覆盖管理表单。 看到以下问题: 创建动态选择字段

唯一的真正方法是为管理面板提供自定义模型表单,并在其中覆盖其行为。 我希望有一个更简单的解决方案(例如能够将函数传递给选择项),但是由于定义数据库时如何使用选择项,所以这不是一个选择。 因此,由于无法为数据库的列提供某些函数生成选项,因此您可以控制哪些选项实际显示在管理面板中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM