django,管理员模板错误 捕获异常时渲染:'NoneType'对象没有'标签'属性

0 投票
1 回答
3103 浏览
提问于 2025-04-15 19:38

大家好!

在我的项目中,有一些模型:

class Category(models.Model):

    name = models.CharField(max_length = 50, blank = False, null = False)

    def __unicode__(self):
        return "Category %s" % self.name

    class Meta:
        db_table = "categories"
        managed = False


class Site(models.Model):

    user = models.ForeignKey(User, blank = False, null = False, db_column = "user_id")
    name = models.URLField(verify_exists = True, blank = False, null = False)
    categories = models.ManyToManyField(Category, blank = True, through = "CategorySites", verbose_name = "Category")

    def __unicode__(self):
        return self.name

    class Meta:
        db_table = "sites"
        managed = False



class CategorySites(models.Model):

    site = models.ForeignKey(Site, blank = False, null = False, db_column = "site_id")
    category = models.ForeignKey(Category, blank = False, null = False, db_column = "category_id")

    def __unicode__(self):
        return "Relation between site %s and category %s" % (self.site.name, self.category.name)

    class Meta:
        db_table = "categories_sites"
        managed = False

如你所见,这里有多对多的关系。一般来说,这个关系运作得很好——我可以通过 manage.py shell 或者服务器端的功能来添加和管理这些模型。

我想在管理网站上启用编辑这种关系,所以我为 Sites 添加了一个管理模型:

 class SiteAdmin(admin.ModelAdmin):

    list_display = ('id', 'name')
    list_filter = ('name', 'categories')

    fieldsets = (
        (None, {"fields": ("categories",)}),
    )

    def queryset(self, request):
        qs = super(SiteAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        else:
            return qs.filter(user = request.user)

    def has_change_permission(self, request, obj=None):
        if not obj:
            return True # So they can see the change list page
        if request.user.is_superuser or obj.user == request.user:
            return True
        else:
            return False

    has_delete_permission = has_change_permission

但是当我进入管理界面 -> sites -> 添加站点(或编辑)时,Django 报错了,提示“捕获到一个异常:'NoneType' 对象没有属性 'label'”。我该怎么解决这个问题呢?

1 个回答

1

为此,你需要在你的 SiteAdmin 类中添加一个未记录的 formfield_for_manytomany 方法:

from django.contrib.admin import widgets

class SitebAdmin(admin.ModelAdmin):

   list_display = ('id', 'name')
   list_filter = ('name', 'categories')

   def formfield_for_manytomany(self, db_field, request, **kwargs):
      if db_field.name == 'categories':
         kwargs['widget'] = widgets.FilteredSelectMultiple(
              db_field.verbose_name, (db_field.name in self.filter_vertical))
      return super(SitebAdmin, self).formfield_for_foreignkey(
         db_field, request, **kwargs)

   fieldsets = (
       (None, {
            "fields": ("name", "categories",)
       }),
   )

这样可以覆盖默认设置,确保在使用了中间模型的情况下,能够显示多个选择的选项,具体可以参考这个文档

虽然这样做是有效的,但我还是觉得在Django中不应该出现错误。

撰写回答