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,查询它并将其返回给调用。工作起来很有魅力。这绝对是最简单的方法,但需要一步一个过程,这样,如果与模板关联的值不符合此特定计划,则可以在保存之前对其进行更改。