2011-03-16 89 views
4

我有一個外鍵引用了一個模型,看起來像這樣基於外鍵選擇填充在Django管理員值

class Plan(models.Model): 
    template = models.ForeignKey(PlanTemplate) 
    throttle = models.IntegerField(default=10) 
    rate_limit = models.BigIntegerField(default=60) 

和外鍵模式:

class PlanTemplate(models.Model): 
    name = models.CharField(max_length=50) 
    throttle = models.IntegerField(default=10) 
    rate_limit = models.BigIntegerField(default=60) 

我在選擇PlanTemplate時,要在Plan管理頁面上自動填充油門和rate_limit。這是django-admin可以輕鬆做到的事情,還是我必須重寫管理模板並添加一些自定義JavaScript?

我正在運行Django 1.2.4。

回答

3

我發現了一個辦法做到這一點,但它必須包含的JavaScript,這實際上是非常簡單的。我在templates/admin/billing /目錄下創建了一個change_form.html,看起來像這樣。

{% extends "admin/change_form.html" %} 

{% block extrahead %} 
    <script src="{{MEDIA_URL}}js/jquery.js" type="text/javascript"></script> 
    <script type="text/javascript"> 
     $(document).ready(function() { 
     $('#id_template').change(function() { 
      $.ajax({ 
      type: 'POST', 
      url: "{% url get_template_info %}", 
      data: {'template_id': $('#id_template').val()}, 
      success: function(data, _status) { 
       $('#id_throttle').val(data.throttle); 
       $('#id_rate_limit').val(data.rate_limit); 
       $('#id_product').val(data.product); 
       $('#id_tier_group').val(data.tier_group); 
      }, 
      dataType: "json" 
      });    
     }); 
     }); 
    </script> 
{% endblock %} 

它命中一個視圖,只需傳入ID,查詢並將其返回給調用。奇蹟般有效。

0

如果您將其分爲兩個步驟,這將很容易實現。也許,有一個add_view,只有1個字段template

否則,您將不得不使用JavaScript並設置一個返回模板數據的視圖。

下面是使用模型管理員和2步形式的簡單的解決方案:

class MyAdmin(ModelAdmin): 
    # ... 

    def add_view(self, request, form_url='', extra_context=None): 
     self.fields = ['template'] # add view has only 1 field. 
     return super(MyAdmin, self).add_view(request, form_url, extra_context) 

    def save_model(self, request, obj, form, change): 
     if not change: 
      # if adding... populate defaults. 
      obj.throttle = obj.template.throttle 
      obj.rate_limit = obj.template.rate_limit 
      obj.save() 
+0

這絕對是最簡單的方式去做,但它需要是一個一步的過程,以便如果與模板相關的值不適合這個特定的計劃,它們可以在任何保存完成之前進行更改。 – 2011-03-16 15:34:30