Проблема Django с generic.GenericTabularInline в админке - PullRequest
0 голосов
/ 04 августа 2011

У меня есть общая медиа-модель Django, которую я хочу связать с рядом других моделей. Кажется, все работает нормально, но я не могу сохранить новые или существующие объекты, используя встроенную форму в админке. Вот соответствующие модели:

from django.db import models
from franklin.utils.content_media import *
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from franklin.core.scripts.models import Script

class Media(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    media_type = models.CharField(max_length = 20, choices = media_types)
    media_file = models.CharField(max_length = 300, blank = True)
    text_value = models.CharField(max_length = 2000, blank = True)
    caption = models.CharField(max_length = 300, blank = True)
    attributes = models.CharField(max_length = 150, blank = True)
    related_id = models.PositiveIntegerField(null = True, blank = True)
    template = models.ForeignKey(Script, null = True, blank = True)
    sort_order = models.IntegerField(default = 1)

class StaticContent(models.Model):
    title = models.CharField(max_length = 100, unique = True)
    key = models.CharField(max_length = 200, unique = True)
    content_type = models.CharField(max_length = 10, choices = content_types)
    content = models.TextField(blank = True)
    media = generic.GenericRelation(Media, content_type_field='content_type', object_id_field='object_id')

Вот код администратора:

from django.contrib import admin
from forms import *
from models import *
from django.contrib.contenttypes import generic

class MediaInline(generic.GenericTabularInline):
    model = Media
    form = MediaFormInline
    extra = 1
    verbose_name_plural = 'media'

class static_content_admin(admin.ModelAdmin):
    inlines = [MediaInline]

admin.site.register(StaticContent, static_content_admin)

Вот оскорбительная форма:

from models import *
from django import forms

class MediaFormInline(forms.ModelForm):

    class Meta:
        model = Media
        fields = ('media_type', 'sort_order',)

Встроенная форма отображается правильно, но при сохранении я получаю следующую ошибку:


Django Версия: 1.3 pre-alpha Тип исключения: TypeError Значение исключения:

Объект 'NoneType' не повторяется

Местоположение исключения: ... django \ contrib \ contenttypes \ generic.py в _ set _ , строка 217


Ошибка возникает с _ set _ метода класса ReverseGenericRelatedObjectsDescriptor. Страница отправляет None с параметром значения _ set _ :

def __set__(self, instance, value):
    if instance is None:
        raise AttributeError("Manager must be accessed via instance")

    manager = self.__get__(instance)
    manager.clear()
    for obj in value:
        manager.add(obj)

Любая помощь с этим будет высоко ценится. Если я не смогу решить эту проблему, мне придется обратиться к решению, которое не так уж СУХО.

1 Ответ

2 голосов
/ 09 февраля 2016

Вам нужно использовать GenericTabularInline. См. Django документы .

Пример:

from django.contrib.contenttypes.admin import GenericTabularInline


class MediatInline(GenericTabularInline):
    model = Media
    extra = 1


class StaticContentAdmin(admin.ModelAdmin):
    inlines = [MediaInline]
...