【问题标题】:Populating values in django-admin based on a foreign key selection根据外键选择在 django-admin 中填充值
【发布时间】:2011-07-16 07:47:36
【问题描述】:

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

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。

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    我找到了一种方法来做到这一点,但它必须涉及 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,对其进行查询并将其返回给调用。像魅力一样工作。

    【讨论】:

      【解决方案2】:

      如果您将其设为两步流程,这将很容易做到。也许,有一个只有 1 个字段的 add_viewtemplate

      否则,您将不得不使用 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()
      

      【讨论】:

      • 这绝对是最简单的方法,但它需要一个步骤的过程,这样如果与模板关联的值不适合这个特定的计划,它们可以被更改在任何保存完成之前。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多