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 尝试聪明,将表单字段放在一个带有 CSSclass="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