Django Admin:根据以前的字段值填充字段 [英] Django Admin: populate the field based on previous field value

查看:281
本文介绍了Django Admin:根据以前的字段值填充字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在django管理员中有一个模型如下

I have a model in django admin as follows

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中实现?

Now based on the type entered by the user ie if user enters type = "a" then action's choices should be set to ChoiceA and if user enters type ="b" then action's choices should be set to ChoiceB. How can I achieve this in Django Admin?

编辑:

action_change.js

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]));
            }
        }

});
});
});


推荐答案

您可以使用Ajax和jQuery实现: p>

models.py:



You can achieve it using Ajax and jQuery:

type   = models.CharField(verbose_name="Expression",max_length=32)
action = models.CharField(max_length=32, choices = (('', ''), ))



admin.py:



admin.py:

class MyModelAdmin(admin.ModelAdmin):
    list_display = ('type', )

    class Media:
        js = ['/static/js/action_change.js']

admin.site.register(MyModel, MyModelAdmin)



urls.py:



urls.py:

url(r'^action_choices/', 'myproject.myapp.views.action_choices'),



views.py:



views.py:

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 中定义正确的路径 ModelAdmin

Create the file action_change.js with following content in your static folder and define correct path in class Media of 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);
}

对于您提出的情况,这应该是正常的。我在下面给出我的建议:

This should work fine for the scenario you asked. And I'm giving my suggestion below:

type   = models.CharField(verbose_name="Expression",max_length=32, choices = (('a', 'a'), ('b', 'b'), ))
action = models.CharField(max_length=32, choices = (('', ''), ))



action_change。 js(第5行)



action_change.js (line 5)

$('#id_type').bind('change', type_change);

这篇关于Django Admin:根据以前的字段值填充字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆