Виджет GenericForeignKey администратора Django

Я создаю приложение Django, в котором все модели могут быть связаны друг с другом в порядке, установленном пользователем. Я настраиваю все это с помощью GenericForeignKeys. Суть в том, что мне нужно иметь возможность поддерживать несколько коллекций этих типов отношений/администрирования. Таким образом, один объект может иметь более одной коллекции связанных объектов.

Кто-нибудь знает хороший виджет GenericForeignKey для этой ситуации? Предпочтительно, чтобы это был поиск с автозаполнением, который заполняет форму администратора, поскольку в итоге у меня может быть большое количество объектов.

Вот код моего приложения, чтобы лучше понять, что я имею в виду.

from django.contrib import admin
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django import forms


# Models
class Base(models.Model):
    title = models.CharField(max_length=255)

    class Meta:
        abstract = True

    def __unicode__(self):
        return self.title

class Related(Base):
    """ A generic relationship model for relating resources.
    """
    order = models.IntegerField(blank=True, null=True)
    limit = models.Q(model = 'Apple') | models.Q(model = 'Orange') | models.Q(model = 'Pear') 

    content_type = models.ForeignKey(ContentType, related_name="related_%(class)s")
    object_id = models.PositiveIntegerField(db_index=True)
    object = generic.GenericForeignKey()

    related_content_type = models.ForeignKey(ContentType, related_name="related_related_%(class)s", limit_choices_to = limit)
    related_object_id = models.PositiveIntegerField(db_index=True)
    related_object = generic.GenericForeignKey('related_content_type', 'related_object_id')

    class Meta:
        ordering = ('order',)
        abstract = True

    def __unicode__(self):
        return self.object.title

class FreshFruit(Related):
    pass

class OldFruit(Related):
    pass

class Apple(Base):
    pass

class Orange(Base):
    pass

class Pear(Base):
    pass

# Admin classes
class FreshFruitInline(generic.GenericStackedInline):
    model = FreshFruit
    extra = 1
    # Admin classes

class OldFruitInline(generic.GenericStackedInline):
    model = OldFruit
    extra = 1

class AppleAdmin(admin.ModelAdmin):
    inlines = [FreshFruitInline, OldFruitInline,]
admin.site.register(Apple, AppleAdmin)

class OrangeAdmin(admin.ModelAdmin):
    inlines = [FreshFruitInline, OldFruitInline,]
admin.site.register(Orange, OrangeAdmin)

class PearAdmin(admin.ModelAdmin):
    inlines = [FreshFruitInline, OldFruitInline,]
admin.site.register(Pear, PearAdmin)

Я искал и искал, и нашел виджеты, которые делают это для отношения ManyToMany, но ничего для моей ситуации.

Спасибо, что нашли время, чтобы посмотреть на это.


person kayluhb    schedule 20.07.2011    source источник


Ответы (1)


Взгляните на общий виджет внешнего ключа Grappelli, который хорошо работает: django -граппелли/универсальный_2_2

person schneck    schedule 20.07.2011
comment
Это выглядело хорошо, но я на самом деле не мог использовать это, так как я использую django-cms (забыл упомянуть об этом), но я создал что-то нестандартное, что, кажется, работает для меня. Спасибо за ответ. - person kayluhb; 27.07.2011