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

时间:2011-04-28 15:04:50

标签: django django-admin foreign-keys

模型上的外键未出现在Django管理站点中。这与字段是否在ModelAdmin实例中明确指定(fields =('title','field-that-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对象,并为广告商生成了两个字段。一些疯狂的管理事务在这里发生......

8 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

我相信我刚刚遇到完全同样的问题,但是由于持久的同事的帮助,它能够调试它。 :)

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

  • Django试图变得聪明,并将表单字段放在带有class="form-row $FIELD_NAME"的div中,
  • 该字段的名称是“advertiser”,因此CSS类是“form-row advertiser”,
  • ... Adblock Plus。

Adblock Plus会隐藏CSS类“广告客户”以及许多其他CSS类的内容。

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

Powellc,您是否在各自的ModelAdmin类中注册了模型?

在ModelAdmin定义之后

admin.site.register(Advertiser, AdvertiserAdmin)

答案 4 :(得分:0)

您在谈论list_display选项,对吧?

相关模型的unicode - 方法是否设置?

  

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

同时检查此帖子是否有一些提示:Can "list_display" in a Django ModelAdmin display attributes of ForeignKey fields?

答案 5 :(得分:0)

尝试停用广告拦截器。不,这不是开玩笑。我刚遇到了这个问题。

答案 6 :(得分:0)

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

advertiser = models.ForeignKey(Advertiser)

adver = models.ForeignKey(Advertiser)

然后我相信它会出现。

答案 7 :(得分:0)

我们遇到了这个问题。

似乎如果你打电话给现场广告客户,管理员会收到“广告客户”类。

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