Python 基于外键选择在django admin中填充值

Python 基于外键选择在django admin中填充值,python,django,django-admin,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 = model

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

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)
我希望在选择PlantTemplate时自动填充“计划管理”页面上的限制和速率限制。这是django管理员可以轻松完成的事情,还是我必须重写管理模板并添加一些自定义javascript


我正在运行Django 1.2.4。

如果您将其设置为两个步骤,那么这将很容易做到。也许,有一个只有一个字段的
add\u视图
模板

否则,您必须使用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()

我找到了一种方法来实现这一点,但它必须涉及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 %}
{%extends“admin/change\u form.html”%}
{%block extrahead%}
$(文档).ready(函数(){
$('#id_模板')。更改(函数(){
$.ajax({
键入:“POST”,
url:“{%url获取\模板\信息%}”,
数据:{'template_id':$('id_template').val(),
成功:功能(数据、状态){
$('id#u throttle').val(data.throttle);
$('id#rate_limit').val(data.rate_limit);
$('id_product').val(data.product);
$('id#tier_group').val(data.tier_group);
},
数据类型:“json”
});               
});
});
{%endblock%}

它点击一个视图,该视图只需获取传入的id,查询它并将其返回给调用。工作起来很有魅力。

这绝对是最简单的方法,但需要一步一个过程,这样,如果与模板关联的值不符合此特定计划,则可以在保存之前对其进行更改。