2011-03-16 94 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