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

5 投票
2 回答
2140 浏览
提问于 2025-04-16 13:48

我有一个模型,它里面有一个外键引用,结构大概是这样的:

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)

我希望在计划(Plan)管理页面上,当选择一个计划模板(PlanTemplate)时,节流(throttle)和速率限制(rate_limit)能够自动填充。请问这是django-admin可以轻松实现的功能吗?还是说我需要修改管理模板,并添加一些自定义的JavaScript代码呢?

我现在使用的是Django 1.2.4。

2 个回答

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

我找到了一种方法来实现这个功能,不过需要用到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,然后查询相关信息并把结果返回给调用者。效果非常好。

撰写回答