2011-04-28 99 views
1

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

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

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对象,并为广告客户创建两个生成的字段。一些疯狂的管理事情发生在这里...

回答

4

我相信我刚刚碰到,确切地说也出现了同样的问题,但是由于持续合作者的帮助,能够进行调试。:)

总之,如果你在原始的HTML源看,你会发现场一直存在 - 它只是:

  • Django的尝试是聪明的,并把表单字段一个div内与CSS class="form-row $FIELD_NAME",
  • 该字段的名称是“广告客户”,所以CSS类是“单排广告客户”,
  • ... Adblock Plus。

Adblock Plus会隐藏任何与CSS类“广告客户”,以及许多其他CSS类的地狱。

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

+0

哈哈,不敢相信这花了我很长时间才能确定这一个。多么愚蠢的错误。多谢你们! – powellc 2012-11-04 02:24:37

+0

你认为当有人试图为广告创建容器时,Django应该引发异常吗?我喜欢。 – thepeer 2013-02-19 17:05:16

0

Powellc,你有模型注册与他们各自的ModelAdmin类吗?

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

+0

哦,是的。对不起,我试图不要冗长,但我认为这不是代码的好处。是的,底部注册了两个ModelAdmins模型。感谢您花时间查看它! – powellc 2011-04-28 15:13:53

0

你说的是list_display选项吧?

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

如果该字段是一个ForeignKey,Django的 将显示 相关对象

同样的的Unicode()检查此线程一些提示:Can "list_display" in a Django ModelAdmin display attributes of ForeignKey fields?

+0

谢谢,但我在这两种模型上都有unicode方法。我也试图吹掉ModelAdmin的(即只是设置他们'通'),似乎没有任何工作... – powellc 2011-04-28 15:23:20

+0

是否有任何字段显示?我的意思是,如果你没有定义ModelAdmin,我不会指望随机字段出现(“如果你不设置list_display,管理站点将显示一个显示每个对象的__unicode __()表示的单个列。 “)。您的ForeignKey是否以change_form或其他形式工作?你可以在shell会话中访问相关模型吗?也许你应该展示你的模型定义。 – arie 2011-04-28 15:32:47

+0

是的,模型显示在管理员,我可以添加他们与广告客户领域与壳很好。这只是因为一些非常奇怪的原因,“广告客户”的外键字段没有被管理员选中。感谢大家看看,我爱的人。 (另外,我已经在上面的问题中附加了模型定义) – powellc 2011-04-28 15:42:54

0

请停用广告拦截器。不,这不是玩笑。我遇到了这个确切的问题。

4

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

0

这确实是一个奇怪的问题。上如果更改

advertiser = models.ForeignKey(Advertiser) 

adver = models.ForeignKey(Advertiser) 

那么AdBase模型,我相信它会显示出来。

0

我们刚碰到这个问题。

看来,如果你打电话给你的现场广告客户在管理中获得一个'广告客户'类。

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

2

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

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