Django管理员选择字段由通用外键的模型字段动态填充

时间:2009-09-18 13:35:05

标签: python django django-models django-admin

假设我有一些标记应用程序的简单模型(这从实际代码中简化):

# Model of tag templates
class TagTemplate(models.Model):
    name = models.CharField()
    content_type = models.ForeignKey(ContentType)

class Tag(models.Model):
    template = models.ForeignKey(TagTemplate)
    object_id = models.PositiveIntegerField()
 *  content_object = generic.GenericForeignKey('template__content_type', 'object_id') 

# Each tag may display the 
class TagTemplateItemDisplay(models.Model):
    template = models.ForeignKey(TagTemplate)
    content_type_field = models.CharField()
    font_size = models.IntegerField()

我有两个问题:

1)在标有*的行中,我从文档中了解到我需要根据contenttype框架传递两个字段名称。在我的例子中,content_type字段在模板模型中指定。我想在'tag'模型中避免重复的content_type字段以使GenericForeignKey正常工作。这可能吗?或者我是否需要一些自定义管理器来在标记模型中实现重复的content_type?

2)我想将管理网站与这些模型一起使用。是否可以动态创建“content_type_field”字段的选项下拉列表,其中内容对应于使用Tabularinline布局时父模型的所选content_type(即tagTemplate)中的字段列表?

例如。在管理站点中,我为包含字段('name','age','dob')的新tagTemplate记录选择一个模型(content_type字段),我希望TabularInline表单动态更新'content_type_field'到包含选项名称,年龄和dob。如果我然后在父tagTemplate content_type字段中选择不同的模型,则内联的子tagTemplateItemDisplay content_type_field中的选项将再次更新。

1 个答案:

答案 0 :(得分:1)

您可以为该模型的表单创建子类

class TagTemplateForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(TagTemplateForm, self).__init__(*args, **kwargs)
        if self.instance.content_type == SomeContentType:
            **dynamically create your fields here**
        elif self.instance.content_type == SomeOtherContentType:
            **dynamically create your other fields here**

然后在您的TagAdmin模型中,您需要:

form = TagTemplateForm

覆盖为管理网站创建的默认表单。

不是一个完整的解决方案,但应该让你开始。

对于动态表单生成,您可以从reading over this

开始