我在django admin中有一个模型如下
ChoiceA= (
("on-false","on-false"),
("on-true","on-true"),
)
ChoiceB = (
("always","always"),
("never","never"),
)
id = models.CharField(verbose_name="Field",max_length=32)
type = models.CharField(verbose_name="Expression",max_length=32)
action = models.CharField(max_length=32, choices=x)
现在根据用户输入的类型,即如果用户输入type =“a”,则应将操作选项设置为ChoiceA,如果用户输入type =“b”,则应将操作选项设置为ChoiceB。我怎样才能在Django Admin中实现这一目标?
编辑:
action_change.js
jQuery(document).ready(function(){
$("#id_type").change( function(event) {
$.ajax({
"type" : "POST",
"url" : "/action_choices/",
"dataType" : "json",
"cache" : false,
"error" : alert("hello"),
"success" : function(json) {
$('#id_action >option').remove();
for(var j = 0; j < json.length; j++){
$('#id_action').append($('<option></option>').val(json[j][0]).html(json[j][1]));
}
}
});
});
});
答案 0 :(得分:5)
您可以使用Ajax和jQuery实现它:
type = models.CharField(verbose_name="Expression",max_length=32)
action = models.CharField(max_length=32, choices = (('', ''), ))
class MyModelAdmin(admin.ModelAdmin):
list_display = ('type', )
class Media:
js = ['/static/js/action_change.js']
admin.site.register(MyModel, MyModelAdmin)
url(r'^action_choices/', 'myproject.myapp.views.action_choices'),
def action_choices(request):
action_list = []
ChoiceA = ("on-false", "on-true")
ChoiceB = ("always", "never")
action_type = request.GET.get('action_type')
if str(action_type).lower() == 'a':
choices = ChoiceA
elif str(action_type).lower() == 'b':
choices = ChoiceB
else:
choices = ()
[action_list.append((each,each)) for each in choices]
json = simplejson.dumps(action_list)
return HttpResponse(json, mimetype='application/javascript')
在静态文件夹中创建包含以下内容的文件action_change.js
,并在class Media
的{{1}}中定义正确的路径。
ModelAdmin
这应该适用于您提出的方案。我在下面给出了我的建议:
(function($){
$(function(){
$(document).ready(function() {
$('#id_type').bind('keyup', type_change);
$('#id_action >option').show();
});
});
})(django.jQuery);
// based on the type, action will be loaded
var $ = django.jQuery.noConflict();
function type_change()
{
var action_type = $('#id_type').val();
$.ajax({
"type" : "GET",
"url" : "/action_choices/?action_type="+action_type,
"dataType" : "json",
"cache" : false,
"success" : function(json) {
$('#id_action >option').remove();
for(var j = 0; j < json.length; j++){
$('#id_action').append($('<option></option>').val(json[j][0]).html(json[j][1]));
}
}
})(jQuery);
}
type = models.CharField(verbose_name="Expression",max_length=32, choices = (('a', 'a'), ('b', 'b'), ))
action = models.CharField(max_length=32, choices = (('', ''), ))
答案 1 :(得分:1)
你必须用所有可能的选择初始化action
字段,否则Django会抱怨以前不存在的选择不是一个有效的选择。
我的建议是使用所有可能的选项初始化字段,并使用JavaScript切换选项的可见性,具体取决于type
的值。有一些插件可以处理Django管理员中的动态字段,但是我见过的大多数插件都处理需要进行查找的ForeignKey或ManyToMany字段。
您可能最好只通过Media
元类向您的管理表单添加一些JavaScript并自行处理。