簡體   English   中英

根據外鍵選擇在django-admin中填充值

[英]Populating values in django-admin based on a foreign key selection

我有一個帶有外鍵引用的模型,看起來像這樣

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。

我找到了一種方法來做到這一點,但它必須涉及到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個字段的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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM