2014-01-16 2 views
6

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

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

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

Я не совсем но вы можете достичь желаемого поведения, используя [get_formsets_with_inlines] (https: // doc s.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_formsets_with_inlines) метод – esauro

+0

Где OptionType? Пожалуйста, сделайте реальный пример – vadimchin

+0

'OptionType' ==' OptionCategory'? – FallenAngel

ответ

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] 
+0

Я должен создать 'initial' в соответствии с существующими опциями, отфильтрованными Документом из' request'? – phoenix

+0

вы можете фильтровать по запросу, но основная часть - вам нужен тип запроса запроса, потому что форма не сохраняется с предопределенными значениями. – vadimchin

+0

Извините за задержку, это работает, но мне пришлось создать список словарей в 'initial' из OptionType ... Но проблема все еще остается. Я создал экземпляр документа, и когда я пытаюсь получить к нему доступ для изменений, у него есть другой набор параметров. – phoenix

Смежные вопросы