Django xadmin插件修复style=“tab“后台不能正常显示

Django xadmin插件修复style="tab"后台不能正常显示

xadmin 用做后台管理插件,在使用中也会有bug出现。这个bug官方没有修复,我调试了很久,修改了源代码,使这个功能能够正常使用。

使用场景: 有两个model 

class CorpuseKeywordsInLine(object):
    model = CorpuseKeywords
    extra = 1
    style = "tab"
    exclude = ["add_time"]

class TopicTagInLine(object):
    model = TopicTag
    extra = 0
    style="tab"
    exclude = ["add_time"]
class CorpuseAdmin(object):
    list_display = ["id","newspaper","title","domain","fav_nums","click_nums","date"]
    search_fields = ["title","domain"]
    list_filter = ["title","domain","date","add_time"]
    ordering = ["-date"]
    inlines = [CorpuseKeywordsInLine,TopicTagInLine]

    def get_form_layout(self):
        if self.org_obj:
            self.form_layout = (
                Main(
                    Fieldset(
                        "语料信息",
                        'title','newspaper','domain','content','language'
                    ),
                    Fieldset(
                        "基本信息",
                        'date','length','url'
                    ),
                ),
                Side(
                    Fieldset("选择信息",
                             'fav_nums', 'click_nums', 'is_classics','add_time','update_time'
                             ),
                )
            )
        return super(CorpuseAdmin,self).get_form_layout()

这个是修复后正常添加,编辑的结果。

源代码修复在xadmin/static/xadmin/js/xadmin.plugin.formset.js这个代码,用下面这个代码替换:

;(function($) {
    $.fn.formset = function(opts){
        var $$ = $(this);

        var options = $.extend({
            prefix: $$.data('prefix')
        }, $.fn.formset.styles[$$.data('style')], opts),

            updateElementIndex = function(elem, prefix, ndx) {
                var idRegex = new RegExp(prefix + '-(\\d+|__prefix__)-'),
                    replacement = prefix + '-' + ndx + '-';
                if (elem.attr("for")) elem.attr("for", elem.attr("for").replace(idRegex, replacement));
                if (elem.attr('id')) elem.attr('id', elem.attr('id').replace(idRegex, replacement));
                if (elem.attr('name')) elem.attr('name', elem.attr('name').replace(idRegex, replacement));
                if (elem.attr('href')) elem.attr('href', elem.attr('href').replace(idRegex, replacement));
                elem.find('.formset-num').html(ndx + 1);
            },

            hasChildElements = function(row) {
                return row.find('input,select,textarea,label,div,a').length > 0;
            },

            updateRowIndex = function(row, i){
                // if (options.update) options.update(row, (function(elem){
                //     updateElementIndex(elem, options.prefix, i);
                // }));
                if (options.update) options.update(row, (function(elem){
                    updateElementIndex(elem, options.prefix);
                }));
                updateElementIndex(row, options.prefix, i);
                row.find('input,select,textarea,label,div,a').each(function() {
                    updateElementIndex($(this), options.prefix, i);
                });
                row.data('row-index', i);
            },

            insertDeleteLink = function(row) {
                row.find('a.delete-row').click(function() {
                    var row = $(this).parents(".formset-row"),
                        del = row.find('input[id $= "-DELETE"]');

                    if (options.removed) options.removed(row, del, $$);

                    if (del.length) {
                        if(del.val() == 'on'){
                            row.removeClass('row-deleted');
                        } else {
                            row.addClass('row-deleted');
                        }
                        del.val(del.val() == 'on'?'':'on');
                    } else {
                        var parent = row.parent();
                        row.remove();
                        var forms = parent.find('.formset-row');
                        $('#id_' + options.prefix + '-TOTAL_FORMS').val(forms.length);
                        for (var i=0, formCount=forms.length; i<formCount; i++) {
                            updateRowIndex(forms.eq(i), i);
                        }
                    }
                    return false;
                });
            };

        $$.find(".formset-row").each(function(i) {
            insertDeleteLink($(this));
        });

        if ($$.length) {
            var template, el = $('#' + options.prefix + '-empty');
            if(el.is('textarea')) {
                template = el.val();
            } else if(el.is('span')) {
                template = el.html();
            }else if(el.is('script')) {
                template = el.html();
            }

            template = el.html(template).text(); // decoded
            template = $($.parseHTML(template));

            template.removeAttr('id');
            if(template.data("replace-id")){
                template.attr('id', template.data("replace-id"));
                template.removeAttr('data-replace-id');
            }
            options.formTemplate = template;

            $('#' + options.prefix + '-add-row').click(function() {
                var formCount = parseInt($('#id_' + options.prefix + '-TOTAL_FORMS').val()),
                    row = options.formTemplate.clone(true).removeClass('empty-form');
                updateRowIndex(row, formCount);
                row.appendTo($$);
                insertDeleteLink(row);
                row.exform();
                $('#id_' + options.prefix + '-TOTAL_FORMS').val(formCount + 1);
                // If a post-add callback was supplied, call it with the added form:
                if (options.added) options.added(row,options.prefix,formCount, $$);
                return false;
            });
        }

        return $$;
    }

    $.fn.formset.styles = {
        'tab': {
            added: function(row,options,formCount, $$){
                var new_tab = $('<li><a data-toggle="tab" href="#'+(options)+'-'+(formCount)+'-body">#<span class="formset-num">'+ (formCount+1) +'</span></a></li>');
                row.attr('id', row.data("replace-id"));
                row.removeAttr('data-replace-id');
                var idRegex = new RegExp(options + '-(\\d+|__prefix__)-'),
                    replacement = options + '-' + formCount + '-';
                if (row.attr('id')) {
                    row.attr('id', row.attr('id').replace(idRegex, replacement));
                }
                else{
                    row.attr('id', options+ '-' +formCount+'-'+'body');
                }

                // console.log($$)
                // console.log(row)
                $$.parent().find('.nav-tabs').append(new_tab);
                new_tab.find('a').tab('show');
            },
            update: function(row, update){
                var rowId = row.attr('id');
                if(rowId){
                    $('a[href=#'+rowId+']').each(function(){
                        update($(this));
                    })
                }
            },
            removed: function(row, del, $$){
                var rowId = row.attr('id');
                if(rowId){
                    var tab = $('a[href=#'+rowId+']');
                    if (del.length) {
                        if(del.val() == 'on'){
                            tab.removeClass('row-deleted');
                        } else {
                            tab.addClass('row-deleted');
                        }
                    } else {
                        if(tab.parent().next().length){
                            tab.parent().next().find('a').tab('show');
                        } else {
                            tab.parent().prev().find('a').tab('show');
                        }
                        tab.parent().remove();
                    }
                }
            }
        }
    };

    $(function(){
        $('.formset-content').each(function(){
            $(this).formset();
        });
    });
})(jQuery);

替换掉源文件中的代码就可以,源码出错的原因是在程序的‘tab’:{add:function.....}这个方法add方法,其实已经创建了tab下面的div,只是在做id标记的时候源码没有能够成功执行                row.removeAttr('data-replace-id');现在我截图看下修改后的tab下面的div

注意看标蓝出,div后面的id,之前出错的原因是这个id没有生成,现在生成就可以正常使用

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值