Skip to main content
 首页 » 编程设计

python之Django Admin 不显示条目

2024年09月03日35davidwang456

如果我为一个特定模型创建一个新条目,它不会显示在 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) 

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

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

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

如果我尝试手动调用 url/admin/agency/agency/1/,我会收到一个 404,表示没有主键为 1 的代理对象

Page not found (404) Request Method: GET Request URL: http://localhost:8000/admin/agency/agency/1/

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

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

但是 pythons shell 说:

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

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

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

请您参考如下方法:

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

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

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

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

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