Поле выбора администратора Django, динамически заполняемое полями модели общего внешнего ключа - PullRequest
3 голосов
/ 18 сентября 2009

Скажем, у меня есть следующие простые модели для некоторых приложений тегирования (это упрощено из реального кода):

# Model of tag templates
class TagTemplate(models.Model):
    name = models.CharField()
    content_type = models.ForeignKey(ContentType)

class Tag(models.Model):
    template = models.ForeignKey(TagTemplate)
    object_id = models.PositiveIntegerField()
 *  content_object = generic.GenericForeignKey('template__content_type', 'object_id') 

# Each tag may display the 
class TagTemplateItemDisplay(models.Model):
    template = models.ForeignKey(TagTemplate)
    content_type_field = models.CharField()
    font_size = models.IntegerField()

У меня два вопроса:

1) В строке, отмеченной *, из документации я понимаю, что мне нужно передать два имени поля в соответствии с фреймворком типа контента. В моем случае поле content_type указывается в модели шаблона. Я хотел бы избежать дублирования поля content_type в модели 'tag', чтобы заставить работать GenericForeignKey. Это возможно? Или мне нужен какой-нибудь специальный менеджер для реализации дублирующегося content_type в модели тегов?

2) Я хотел бы использовать сайт администратора с этими моделями. Можно ли динамически создать раскрывающийся список выбора для поля 'content_type_field', где содержимое соответствует списку полей из выбранного content_type родительской модели (т. Е. TagTemplate) при использовании макета Tabularinline?

например. на сайте администратора я выбираю модель (поле content_type) для новой записи tagTemplate, содержащей поля ('name', 'age', 'dob'), я хотел бы, чтобы формы TabularInline динамически обновляли поле 'content_type_field' до содержать выбор имени, возраста и доб. Если затем я выберу другую модель в родительском поле tagTemplate content_type, варианты дочернего tagTemplateItemDisplay content_type_type встроенного элемента обновляются снова.

1 Ответ

1 голос
/ 12 мая 2011

Вы можете создать подкласс для этой модели

class TagTemplateForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(TagTemplateForm, self).__init__(*args, **kwargs)
        if self.instance.content_type == SomeContentType:
            **dynamically create your fields here**
        elif self.instance.content_type == SomeOtherContentType:
            **dynamically create your other fields here**

Тогда в вашей модели TagAdmin вам нужно иметь:

form = TagTemplateForm

для переопределения формы по умолчанию, созданной для сайта администратора.

Не полное решение, но вам стоит начать.

Для создания динамической формы вы можете начать с , читая это

...