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

ForeignKey field will not appear in Django admin site

模型上的外键未出现在Django管理网站中。这与是否在modeladmin实例中显式指定字段(字段=('title'、'field that not show up')无关。

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

1
2
3
4
5
6
7
8
9
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的管理员中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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对象,并为广告客户生成两个字段。这里发生了一些疯狂的行政事务…


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

简而言之,如果您查看原始HTML源代码,您会发现该字段一直都在那里-只是:

  • Django很聪明,用css class="form-row $FIELD_NAME"把表单字段放在一个DIV中,
  • 该字段的名称是"广告客户",因此CSS类是"窗体行广告客户",
  • …Adblock Plus。

adblock plus将隐藏CSS类"广告商"的任何内容,以及大量其他CSS类。

我认为这是姜戈的一个错误。


可能是编码错误。我也遇到了同样的问题,但是当我在models.py中添加了——编码:utf-8——时,一切都很好。


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

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


我们刚刚碰到这个问题。

看起来,如果你把你的现场广告商称为管理员,就会得到一个"广告商"类。

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


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

1
advertiser = models.ForeignKey(Advertiser)

1
adver = models.ForeignKey(Advertiser)

然后我相信它会出现。


尝试禁用广告阻止程序。不,这不是玩笑。我刚碰到这个确切的问题。


你说的是list_display选项,对吧?

您的相关模型集是否使用unicode方法?

If the field is a ForeignKey, Django
will display the unicode() of the
related object

还要检查这个线程以获取一些提示:django modeladmin中的"list_display"是否可以显示foreignkey字段的属性?


鲍威尔,你有没有在各自的modeladmin类中注册模型?

modeladmin定义后的admin.site.register(Advertiser, AdvertiserAdmin)