Поле ForeignKey не будет отображаться на сайте администратора Django - PullRequest
1 голос
/ 28 апреля 2011

Внешний ключ модели не отображается на сайте администратора 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/")

Тайна углубляется. Я только что попытался создать объект ModelForm как для AdBase, так и для BannerAd, и оба сгенерировали поля для рекламодателя. Здесь происходят какие-то безумные админские вещи ...

Ответы [ 8 ]

4 голосов
/ 16 ноября 2011

возможно, это ошибка кодирования. У меня была та же проблема, но когда я добавил # - - кодирование: UTF-8 - - в models.py, все хорошо.

4 голосов
/ 07 июня 2012

Я считаю, что только что столкнулся с точно той же проблемой, но смог отладить ее благодаря помощи постоянных сотрудников.:)

Короче говоря, если вы посмотрите в исходном HTML-источнике, вы обнаружите, что поле всегда было там - это просто:

  • Джанго пытается быть умным и поставитьполе формы внутри div с CSS class="form-row $FIELD_NAME",
  • Имя поля было "рекламодатель", поэтому класс CSS был "рекламодатель из строки формы",
  • ... Adblock Plus.

Adblock Plus будет что-то скрывать с помощью класса CSS «рекламодатель», а также множества других классов CSS.

Я считаю это ошибкой в ​​Django.

3 голосов
/ 17 августа 2014

Еще одна очень глупая причина той же проблемы:

Если существует только один экземпляр связанной модели , то фильтр просто не будет отображаться. В классе RelatedFieldListFilter есть метод has_output(), который в этом случае возвращает False.

0 голосов
/ 07 июня 2012

Мы только что столкнулись с этой проблемой.

Кажется, что если вы называете себя полевым рекламодателем, то в администраторе вам будет предоставлен класс "рекламодателя".

Затем скрывается стандартнымплагины блокировки рекламы.Если вы просматриваете источник, ваше поле будет там.

0 голосов
/ 07 декабря 2011

Это странная проблема наверняка. На модели AdBase при изменении

advertiser = models.ForeignKey(Advertiser)

до

adver = models.ForeignKey(Advertiser)

тогда я верю, что это проявится.

0 голосов
/ 21 сентября 2011

Попробуйте отключить блокировку рекламы. Нет, это не шутка. Я просто столкнулся с этой проблемой.

0 голосов
/ 28 апреля 2011

Вы говорите о опции list_display, верно?

Является ли unicode -метод для вашей связанной модели?

Если поле является ForeignKey, Django будет отображать Unicode () из связанный объект

Также проверьте эту ветку на наличие подсказок: Может ли "list_display" в Django ModelAdmin отображать атрибуты полей ForeignKey?

0 голосов
/ 28 апреля 2011

Пауэлл, у вас есть модели, зарегистрированные в соответствующем классе ModelAdmin?

admin.site.register(Advertiser, AdvertiserAdmin) после определений ModelAdmin.

...