根据外键选择在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)
我希望在计划(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,然后查询相关信息并把结果返回给调用者。效果非常好。