1

我正在编写一个 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。基本上,两者之间必须存在一对一的关系,但我遇到了问题,因为我不想让 CHOICES 成为模型。

4

3 回答 3

0

我会在 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 中而不是像您拥有的那样放在模块范围内是常规且更简洁的。

于 2013-10-05T21:53:24.243 回答
0

您需要使用 StaticItem 的动态选择来覆盖管理表单。请参阅此问题:创建动态选择字段

于 2013-10-06T00:17:57.903 回答
0

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

于 2013-11-12T08:32:20.803 回答