我正在编写一个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成为一个模型。
答案 0 :(得分: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而不是模块范围内是常规和清晰的。
答案 1 :(得分:0)
您需要使用StaticItem的动态选项覆盖管理表单。请参阅此问题:Creating a dynamic choice field
答案 2 :(得分:0)
唯一真正的方法是为管理面板提供自定义模型表单并覆盖其中的行为。我希望有一个更简单的解决方案(比如能够将一个函数传递给选项),但由于在定义数据库时如何使用选项,这不是一个选项。因此,由于您无法为数据库的列生成某些函数,因此您可以控制在管理面板中实际显示哪些选项。