【问题标题】:Django Admin doesn't show entriesDjango Admin 不显示条目
【发布时间】:2010-12-24 19:06:51
【问题描述】:

如果我为一个特定模型创建一个新条目,它不会显示在 django 管理员中。

代理模式造成了麻烦。

# catalog.models

class Content(models.Model):

    class Meta:
        abstract = True

    BUNDESLAND_CHOICES = (
        ('bw', 'Baden-Württemberg'),
        ('by', 'Bayern'),
        ('be', 'Berlin'),
        ('bb', 'Brandenburg'),
        ('hb', 'Bremen'),
        ('hh', 'Hamburg'),
        ('he', 'Hessen'),
        ('mv', 'Mecklenburg-Vorpommern'),
        ('ni', 'Niedersachsen'),
        ('nw', 'Nordrhein-Westfalen'),
        ('rp', 'Rheinland-Pfalz'),
        ('sl', 'Saarland'),
        ('sn', 'Sachsen'),
        ('st', 'Sachsen-Anhalt'),
        ('sh', 'Schleswig-Holstein'),
        ('th', 'Thüringen'),
    )

    name = models.CharField(max_length=255, verbose_name='Agentur')
    address = models.CharField(max_length=255, verbose_name='Straße')
    state = models.CharField(max_length=2, choices=BUNDESLAND_CHOICES, verbose_name='Bundesland')
    city = models.CharField(max_length=255, verbose_name='Stadt')
    zip = models.CharField(max_length=10, verbose_name='PLZ')
    phone = models.CharField(max_length=40, blank=True, verbose_name='Telefonnr.')
    fax = models.CharField(max_length=40, blank=True, verbose_name='Fax')
    email = models.EmailField(verbose_name='E-Mail', help_text='Offizielle E-Mail')
    url = models.URLField(verbose_name='URL')
    owner = models.CharField(max_length=255, verbose_name='Besitzer')
    description = models.TextField(verbose_name='Beschreibung')
    category = models.ManyToManyField(Category, verbose_name='Kategorie')
    user = models.ForeignKey(User, verbose_name='Benutzer', null=True, blank=True)
    slug = models.SlugField(max_length=80, blank=True)
    identity = models.CharField(max_length=64, unique=True, blank=True)
    identity_used = models.BooleanField(default=False)
    show = models.BooleanField(default=False, verbose_name='Anzeigen')
    tp = models.DateTimeField(auto_now_add=True)


# agency.models
class AgencyActiveManager(models.Manager):
    def get_query_set(self):
        return super(AgencyActiveManager,self).get_query_set().filter(show=True)

class Agency(Content):
    clients = models.TextField(verbose_name='Klienten')
    active = AgencyActiveManager()
    objects = models.Manager()

    def __unicode__(self):
        return self.name

    def save(self, **kwargs):
        if not self.identity:
            self.identity = hashlib.sha256('%s:%s' %(get_word(),datetime.datetime.now())).hexdigest()
        if not self.slug:
            self.slug = slugify(self.name, instance=self)
        super(Agency, self).save(**kwargs)

# agency.admin

from django.contrib import admin
from agency.models import Agency

admin.site.register(Agency)

我在管理员中创建了一个新的代理商条目并保存了它。 通过python shell查询显示保存成功

In [15]: Agency.objects.all()
Out[15]: [<Agency: Argentur>]

管理页面说: '0 个机构'

如果我尝试手动调用 url /admin/agency/agency/1/ 我得到一个 404 说没有具有主键 1 的代理对象

找不到页面 (404) 请求方法:GET 请求网址:http://localhost:8000/admin/agency/agency/1/

Das Agency-Objekt mit dem Primärschlüssel u'1' ist nicht vorhanden。

您看到此错误是因为您的 Django 设置文件中有 DEBUG = True。将其更改为 False,Django 将显示标准 404 页面。

但是pythons shell说:

In [16]: Agency.objects.all()[0].pk
Out[16]: 1

我是否遗漏了一些非常明显的东西?

我的猜测是它与抽象模型有关,但我不知道是什么。

【问题讨论】:

    标签: python django-models django-admin


    【解决方案1】:

    模型类定义中列出的第一个管理器是用于管理站点和许多其他操作的管理器。

    在 Django 中存在许多与使用不返回所有实例作为默认管理器的管理器相关的错误。恕我直言,您最好使用标准管理器作为默认管理器,然后添加更多限制性管理器。

    事实上,我不再编写使用多个经理的模型。我会写

    class AgencyManger(models.Manager):
        def active(self):
            return self.filter(show=True)
    

    并将其用作Agency.objects,因此活动对象的根查询集是Agency.objects.active(),而不是Agency.active.all()。这意味着.objects. 将始终具有相同的众所周知的行为。在代码中也更容易发现和理解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2021-10-02
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多