2014-01-16 33 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.doctypeOptionCategory中添加相似的doctype字段後) - 最好使用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

我應該根據從request中過濾的現有選項創建'initial'? – phoenix

+0

您可以根據請求進行過濾,但是主要部分 - 您需要檢查請求類型,因爲表單沒有使用預定義的值進行保存。 – vadimchin

+0

對不起,延遲,它的工作原理,但我不得不創建字典清單的'初始'從OptionType ... 但仍然存在問題。我創建了Document實例,當我嘗試訪問它以進行更改時,它有另一組選項。 – phoenix