Джанго форма администратора с предопределенными инлайн

Обновить

December 2018

Просмотры

957 раз

6

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

Давайте сделаем пример:

class Document(models.Model):
    DOC_TYPES = ((DC1, 'Doc type 1'), (DC2, 'Doc type 2'))
    doctype = model.CharField(choices=DOC_TYPES, default=DC1)

class OptionCategory(models.Model):
    name = model.CharField()

class Option(models.Model):
    document = models.ForeignKey(Document)
    option_category = models.ForeignKey(OptionCategory)
    some_data = models.CharField()

Предположим, что параметр определен встроенный в модели документа администратора.

OptionCategoryнадо - те могут быть добавлен администратором - Я хотел бы иметь форму создания для документа с таким количеством моделей опционных в инлайн формах, есть опция категория. Это может быть достигнуто легко с помощью дополнительных услуг в Optionмодели администратора. Эти вопросы являются:

  1. Как представить встроенные поля с разной категорией опций предварительно выбрана?
  2. Как изменить параметры динамически (на основе Document.doctypeпосле добавления аналогичного поля DOCTYPE в OptionCategory) - желательно с AJAX?

1 ответы

3
  1. Как представить встроенные поля каждый с различным типом опции предварительно выбрано:

models.py

    class DocType(models.Model):
        name = models.CharField(max_length=255)

        def __unicode__(self):
            return self.name


    class Document(models.Model):
        doc_type = models.ForeignKey(DocType)
        some_data = models.CharField(max_length=255)

        def __unicode__(self):
            return self.some_data


    class OptionType(models.Model):
        name = models.CharField(max_length=255)
        doc_type = models.ForeignKey(DocType)

        def __unicode__(self):
            return self.name


    class Option(models.Model):
        document = models.ForeignKey(Document)
        option_type = models.ForeignKey(OptionType)
        some_data = models.CharField(max_length=255)

        def __unicode__(self):
            return self.some_data

admin.py

 class InlineOption(admin.TabularInline):
    model = Option
    extra = 3

    initial = [
        {'some_data': 'init_val1', 'option_type': 1},
        {'some_data': 'init_val2'},
    ]

    create_from_default = True

    def get_formset(self, request, obj=None, **kwargs):
        initial = self.initial[:]

        class _Form(forms.ModelForm):
            form_initial = initial

            def __init__(self, *args, **kwargs):
                if len(self.form_initial) and not 'instance' in kwargs:
                    kwargs['initial'] = self.form_initial.pop(0)
                return super(_Form, self).__init__(*args, **kwargs)

        if self.create_from_default:
            if request.method == 'GET':
                self.form = _Form
            else:
                self.form = forms.ModelForm
        else:
            self.form = _Form

        return super(InlineOption, self).get_formset(request, obj, **kwargs)



class AdminDocument(admin.ModelAdmin):
    inlines = [InlineOption]

Связанные вопросы