2009-11-06 54 views
0

比方說,我有這樣的模式:Django管理:如何動態值插入外接內聯形式

class Foo(models.Model): 
    bar = models.ForeignKey(Bar) 
    currency = models.ForeignKey(Currency) # currency is just an example 
    is_active = models.BooleanField() 

現在假設foo是酒吧的內聯。而且我總是想要指出每種貨幣的價值?如果我可以用一個小部件代替那些貨幣下拉菜單,它只是以隱藏字段的形式返回文本名稱。 因此,例如,一個附加頁面上,而不是具有內嵌顯示此:

- currency drop down menu is_active checkbox 
- currency drop down menu is_active checkbox 
- currency drop down menu is_active checkbox 

有它表明這一點:

- currency name 1 is_active checkbox 
- currency name 2 is_active checkbox 
- currency name 3 is_active checkbox 
- currency name 4 is_active checkbox 
- currency name 5 is_active checkbox 

什麼將是實現這一目標的正確方法?我假設我將不得不重寫一些表單類的方法。謝謝。

回答

0

我用javascript解決了它。 將以下內容插入表格或堆疊模板的頂部。它假定名稱列被命名爲名稱。

{% with inline_admin_formset.opts as i %} 
    {% if i.pre_filled %} 
     <script language="JavaScript" type="text/javascript"> 
     jQuery(function($) {  
      var pre_values = [ 
      {% for name in i.pre_filled %} 
       {% if forloop.last %} 
       [{{ name.id }}, "{{ name.name }}"] 
       {% else %} 
       [{{ name.id }}, "{{ name.name }}"],  
       {% endif %} 
      {% endfor %} 
      ]; 

      $.each(pre_values, 
       function(i, value){ 
        $('div.inline-group div.tabular').each(function() { 
         $("#id_{{ i.verbose_name|lower|cut:" " }}_set-" + i + "-{{ i.pre_field }}").after(value[1]); 
         $("#id_{{ i.verbose_name|lower|cut:" " }}_set-" + i + "-{{ i.pre_field }}").val(value[0]).hide(); 
         $("#lookup_id_{{ i.verbose_name|lower|cut:" " }}_set-" + i + "-{{ i.pre_field }}").hide();  
         $("strong").hide(); 
        }); 
       } 
      ); 
     }); 
     </script> 
    {% endif %} 
{% endwith %} 

而且這正好在你的inline.py:

class MyCustomInline(admin.TabularInline): 
    pre_filled = [] 
    pre_field = '' 

    def get_fieldsets(self, request, obj=None): 
     if not obj and self.pre_filled and self.pre_field: 
      count = self.pre_filled.count() 
      self.extra = count 
      self.max_num = count 
      if self.raw_id_fields: 
       self.raw_id_fields.append(self.pre_field) 
      else: 
       self.raw_id_fields = [self.pre_field] 

     return super(MyCustomInline, self).get_fieldsets(request, obj) 

class FooInline(MyCustomInline): 
    model = Foo 
    pre_filled = Currency.objects.all() 
    pre_field = 'currency' 
0

如果你總是希望使用相同幣種:如果你想改變的飛行子類的形式貨幣,並覆蓋初始化在那裏你可以做self.fields['currency']你的魔

currency = models.ForeignKey(Currency, default = lambda: Currency.objects.get(...) 

如果您想要隱藏該字段,請在表單類的該字段上使用widget = forms.HiddenInput()

我認爲這回答你的問題,但不是你真正的問題。使用[django-currency] [1]來靈活處理貨幣。

[1]:http://code.google.com/p/django-currencies/ Django的貨幣

+0

謝謝您的回答,但你似乎誤解了我的問題。我修改了我的問題,使其更清晰。 – orwellian

0

第一個問題在這裏解決是生成前聯FOOS每個列中的適當的。你可以在Bar上使用自定義的save()方法,或者使用信號,或者在BarManager的Bar工廠方法中做到這一點...

一旦完成,我認爲你的管理問題可以像這樣解決:

class FooInline(admin.TabularInline): 
    formfield_overrides = {models.ModelChoiceField: {'widget': ReadOnlyWidget}} 
    model = Foo 
    extra = 0 

你在哪裏使用像the one here這樣的自定義ReadOnlyWidget。