根据外键选择在django-admin中填充值

时间:2011-03-16 04:49:43

标签: python django django-admin

我有一个带有外键引用的模型,看起来像这样

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时自动填充计划管理页面上的油门和rate_limit。这是django-admin可以轻松做的事情,还是我必须覆盖管理模板并添加一些自定义的JavaScript?

我正在运行Django 1.2.4。

2 个答案:

答案 0 :(得分: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,查询并将其返回给调用。像魅力一样。

答案 1 :(得分:0)

如果您将其分为两个步骤,这将很容易实现。也许,add_view只有一个字段template

否则,您将不得不使用JavaScript并设置一个返回模板数据的视图。

这是一个使用模型管理员和两步形式的简单解决方案:

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()