Django Multiple GenericRelation related_name в админке - PullRequest
0 голосов
/ 10 марта 2012

Я пытаюсь создать общий внешний ключ и многократно использовать его внутри одной и той же модели

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

Я пытался использовать fk_name, передавая значение related_name, определенное в модели, но без удачи

Вот код, который поможет любая помощь

model.py:

class TranslatedCharField(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    class Meta:
        unique_together = ('object_id', 'lang')

    lang = models.CharField(max_length=255, choices=LANGUAGES)
    text = models.CharField(max_length=255)

class Evento(models.Model):
    slug = generic.GenericRelation(TranslatedCharField, related_name="slug")
    titolo = generic.GenericRelation(TranslatedCharField, related_name="title")

admin.py:

class TranslatedSlugInline(generic.GenericTabularInline):
    extra = 0
    model = TranslatedCharField
    verbose_name = "Slug"
    verbose_name_plural = "Slug"


class TranslatedTitoloInline(generic.GenericTabularInline):
    extra = 1
    model = TranslatedCharField
    verbose_name = "Titolo"
    verbose_name_plural = "Titolo"


class EventoAdmin(admin.ModelAdmin):
    inlines = [
    TranslatedSlugInline,
    TranslatedTitoloInline,
    ]

admin.site.register(Evento, EventoAdmin)

это результат: enter image description here

как вы можете видеть, список TranslatedCharField дублируется для двух отношений

Ответы [ 2 ]

0 голосов
/ 11 марта 2012

хорошо, я пересмотрел вещи, но результат таков:

class TranslatedCharField(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    relation_field = models.CharField(max_length=255)

    class Meta:
        unique_together = ('object_id', 'lang', 'relation_field')

    lang = models.CharField(verbose_name="lingua", max_length=255, choices=LANGUAGES)
    text = models.CharField(verbose_name="testo", max_length=255)


def translatedFieldInlineAdminFormFactory(relation_field, translatemodel):
    class TranslatedFieldInlineAdminForm(forms.ModelForm):

        class Meta:
            model = translatemodel

        def clean(self):
            self.cleaned_data["relation_field"] = relation_field
            return self.cleaned_data

class TranslatedTabularInline(generic.GenericTabularInline):
    def __init__(self, *args, **kwargs):
        super(TranslatedTabularInline, self).__init__(*args, **kwargs)
        self.form = translatedFieldInlineAdminFormFactory(self._relation_field_filter, self.model)

    extra = 1
    max_num = len(LANGUAGES)
    exclude = ('relation_field',)
    model = None
    _relation_field_filter = None
    return TranslatedFieldInlineAdminForm

Таким образом, когда мне нужно несколько TranslatedCharField, я делаю следующее

на админа:

class TranslatedSlugInline(TranslatedTabularInline):
    model = TranslatedCharField
    _relation_field_filter = "slug_event_portal"
    verbose_name = "Slug"
    verbose_name_plural = "Slug"

class TranslatedSlugInline(TranslatedTabularInline):
    model = TranslatedCharField
    _relation_field_filter = "slug2_event_portal"
    verbose_name = "Slug2"
    verbose_name_plural = "Slug2"

благодаря чистому методу для каждого встроенного файла используется специальный _relation_field_filter это позволяет мне, по крайней мере, сохранять их различимыми и извлекать их, используя пользовательский набор запросов Я все еще работаю над моделью Evento, чтобы получить определенный набор значений вместо целых связанных полей, но я думаю, что я не слишком далеко сейчас

0 голосов
/ 11 марта 2012
unique_together = ('object_id', 'lang')

Я думаю, что вы хотите

unique_together = ('content_type', 'object_id', 'lang')

, потому что object_id не уникален для всех моделей.

slug = generic.GenericRelation(TranslatedCharField, related_name="slug")
titolo = generic.GenericRelation(TranslatedCharField, related_name="title")

«related_name» - это то, как TranslatedCharField может получить доступ в другом направлении,т. е. по какому имени атрибута вы хотите получить доступ к этому Evento."slug_event" и "title_event" более подходящие.

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