django, ошибка шаблона администратора. Возникла исключительная ситуация при рендеринге: объект 'NoneType' не имеет атрибута 'label' - PullRequest
0 голосов
/ 23 февраля 2010

Добрый день, ребята! В проекте, среди прочего, есть модели:

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 или функции на стороне сервера. Я хочу разрешить редактирование этого типа отношений на сайте администратора, поэтому я добавил модель администратора для сайтов:

 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

но когда я захожу в admin-> sites-> Add site (или edit), django выдает исключение при рендеринге: объект NoneType не имеет атрибута label. как можно это исправить?

1 Ответ

1 голос
/ 23 февраля 2010

Для этого вам нужно добавить недокументированный метод formfield_for_manytomany в ваш SiteAdmin класс:

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",)
       }),
   )

для переопределения по умолчанию отсутствия отображения многократного виджета для моделей с указанным параметром сквозной передачи docs .

Хотя это работает, я все же думаю, что это не должно вызывать ошибки в Django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...