ForeignKey 字段不会出现在 Django 管理站点中

Posted

技术标签:

【中文标题】ForeignKey 字段不会出现在 Django 管理站点中【英文标题】:ForeignKey field will not appear in Django admin site 【发布时间】:2011-08-14 19:29:37 【问题描述】:

模型上的外键未出现在 Django 管理站点中。这与字段是否在 ModelAdmin 实例中明确指定(字段 = ('title', 'field-that-does-not-show-up'))无关。

我意识到有很多变量可能会导致这种行为。

class AdvertiserAdmin(admin.ModelAdmin):
    search_fields = ['company_name', 'website']
    list_display = ['company_name', 'website', 'user']


class AdBaseAdmin(admin.ModelAdmin):
    list_display = ['title', 'url', 'advertiser', 'since', 'updated', 'enabled']
    list_filter = ['updated', 'enabled', 'since', 'updated', 'zone']
    search_fields = ['title', 'url']

问题是 AdBase 的管理员中没有显示广告客户外键

class Advertiser(models.Model):
    """ A Model for our Advertiser
    """
    company_name = models.CharField(max_length=255)
    website = models.URLField(verify_exists=True)
    user = models.ForeignKey(User)

    def __unicode__(self):
        return "%s" % self.company_name

    def get_website_url(self):
        return "%s" % self.website

class AdBase(models.Model):
    """
    This is our base model, from which all ads will inherit.
    The manager methods for this model will determine which ads to
    display return etc.

    """
    title = models.CharField(max_length=255)
    url = models.URLField(verify_exists=True)
    enabled = models.BooleanField(default=False)
    since = models.DateTimeField(default=datetime.now)
    expires_on=models.DateTimeField(_('Expires on'), blank=True, null=True)
    updated = models.DateTimeField(editable=False)

    # Relations
    advertiser = models.ForeignKey(Advertiser)
    category = models.ForeignKey(AdCategory)
    zone = models.ForeignKey(AdZone)

    # Our Custom Manager
    objects = AdManager()

    def __unicode__(self):
        return "%s" % self.title

    @models.permalink
    def get_absolute_url(self):
        return ('adzone_ad_view', [self.id])

    def save(self, *args, **kwargs):
        self.updated = datetime.now()
        super(AdBase, self).save(*args, **kwargs)

    def impressions(self, start=None, end=None):
        if start is not None:
            start_q=models.Q(impression_date__gte=start)
        else:
            start_q=models.Q()
        if end is not None:
            end_q=models.Q(impression_date__lte=end)
        else:
            end_q=models.Q()
        return self.adimpression_set.filter(start_q & end_q).count()

    def clicks(self, start=None, end=None):
        if start is not None:
            start_q=models.Q(click_date__gte=start)
        else:
            start_q=models.Q()
        if end is not None:
            end_q=models.Q(click_date__lte=end)
        else:
            end_q=models.Q()
        return self.adclick_set.filter(start_q & end_q).count()

class BannerAd(AdBase):
    """ A standard banner Ad """
    content = models.ImageField(upload_to="adzone/bannerads/")

谜团加深。我只是尝试为 AdBase 和 BannerAd 创建一个 ModelForm 对象,并且都为广告商生成了字段。这里发生了一些疯狂的管理事情......

【问题讨论】:

【参考方案1】:

我相信我刚刚遇到了完全同样的问题,但在坚持不懈的同事的帮助下,我能够调试它。 :)

简而言之,如果您查看原始 html 源代码,您会发现该字段始终存在 - 就是这样:

Django 尝试聪明,将表单字段放在一个带有 CSS class="form-row $FIELD_NAME" 的 div 中, 字段名称为“advertiser”,因此 CSS 类为“form-row advertiser”, ...Adblock Plus。

Adblock Plus 将隐藏任何具有 CSS 类“广告商”的内容,以及大量其他 CSS 类。

我认为这是 Django 中的一个错误。

【讨论】:

哈哈,真不敢相信我花了这么长时间才搞定这个。多么愚蠢的错误。谢谢大家! 当有人试图为广告创建容器时,您认为 Django 应该引发异常?我喜欢它。【参考方案2】:

可能是编码错误。我遇到了同样的问题,但是当我在 models.py 中添加 # -- coding: UTF-8 -- 时,一切正常。

【讨论】:

【参考方案3】:

同样问题的另一个非常愚蠢的原因:

如果相关模型只有一个实例,则过滤器根本不会显示。在这种情况下,RelatedFieldListFilter 类中有一个 has_output() 方法返回 False

【讨论】:

【参考方案4】:

这肯定是一个奇怪的问题。如果您更改,则在 AdBase 模型上

advertiser = models.ForeignKey(Advertiser)

adver = models.ForeignKey(Advertiser)

那我相信它会出现的。

【讨论】:

【参考方案5】:

Powellc,你有在各自的 ModelAdmin 类中注册的模型吗?

admin.site.register(Advertiser, AdvertiserAdmin) 在 ModelAdmin 定义之后。

【讨论】:

哦,是的。对不起,我试图不冗长,但我想这对代码来说不是一件好事。是的,底部将两个模型都注册到它们的 ModelAdmins 中。感谢您抽出宝贵时间查看它!【参考方案6】:

您说的是list_display 选项,对吧?

你的相关模型集是unicode-方法吗?

如果字段是 ForeignKey,Django 将显示 unicode() 相关对象

还可以查看此线程以获取一些提示:Can "list_display" in a Django ModelAdmin display attributes of ForeignKey fields?

【讨论】:

谢谢,但我在两个模型上都有 unicode 方法。我也尝试过炸毁两个 ModelAdmin(即将它们设置为“通过”),但似乎没有任何效果...... 是否有任何字段显示?我的意思是,如果您不定义 ModelAdmin,我不会期望显示随机字段(“如果您不设置 list_display,管理站点将显示一个显示每个对象的 __unicode__() 表示形式的列。 ”)。您的 ForeignKey 是否以 change_form 或任何其他形式工作?您可以在 shell 会话中访问相关模型吗?也许你也应该展示你的模型定义。 是的,模型显示在管理员中,我可以使用 shell 将它们添加到广告客户字段中。只是由于某些非常奇怪的原因,管理员没有选择“广告商”外键字段。感谢大家看一看,我爱堆栈的人。 (另外,我已将模型定义附加到上述问题中) 哦,其实我说的是“fields=()”方法 但是 fields() 控制 change_form 中显示的字段,而不是 change_list 中显示的字段(并且您的原始问题未提及字段)。所以我有点困惑;-) 如果您不覆盖 AdBase 的默认管理器 (objects = AdManager()) 会有所不同吗?【参考方案7】:

尝试禁用您的广告拦截器。不,这不是玩笑。我刚刚遇到了这个确切的问题。

【讨论】:

【参考方案8】:

我们刚刚遇到了这个问题。

似乎如果您在管理员中称您为现场广告商,则会获得一个“广告商”类。

然后被标准广告拦截插件隐藏。如果您查看源代码,您的字段将在那里。

【讨论】:

以上是关于ForeignKey 字段不会出现在 Django 管理站点中的主要内容,如果未能解决你的问题,请参考以下文章

带有额外字段的 Django ManyToMany 字段不会显示在两个关系上

允许 Django 模型 ForeignKey 字段的表单上的 TextInput

ForeignKey vs OneToOne 字段 django [重复]

带有_id的Django后缀ForeignKey字段

django admin中的ForeignKey字段

Django ForeignKey 表单字段小部件