From 0e4d8d47b0cc8f1d1930ec1b59204313f42412e7 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Sat, 5 Feb 2011 04:46:55 +0000 Subject: [PATCH] [1.2.X] Fixed #14303 -- Ensure that the ids created for new inlines are unique after interstitial deletions have occurred. Thanks to m0nonoke for the report, and Julien Phalip for the patch. Backport of r15422 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@15423 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/contrib/admin/media/js/inlines.js | 5 +++-- django/contrib/admin/media/js/inlines.min.js | 10 +++++----- django/contrib/admin/media/js/prepopulate.min.js | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/django/contrib/admin/media/js/inlines.js b/django/contrib/admin/media/js/inlines.js index c48c1f5c57..ddaf3557af 100644 --- a/django/contrib/admin/media/js/inlines.js +++ b/django/contrib/admin/media/js/inlines.js @@ -31,6 +31,7 @@ } }; var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").attr("autocomplete", "off"); + var nextIndex = parseInt(totalForms.val()); var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").attr("autocomplete", "off"); // only show the add button if we are allowed to add more items, // note that max_num = None translates to a blank string. @@ -53,12 +54,12 @@ } addButton.click(function() { var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS"); - var nextIndex = parseInt(totalForms.val()); var template = $("#" + options.prefix + "-empty"); var row = template.clone(true); row.removeClass(options.emptyCssClass) .addClass(options.formCssClass) .attr("id", options.prefix + "-" + nextIndex); + nextIndex += 1; row.find("*") .filter(function() { var el = $(this); @@ -94,7 +95,7 @@ // Insert the new form when it has been fully edited row.insertBefore($(template)); // Update number of total forms - $(totalForms).val(nextIndex + 1); + $(totalForms).val(parseInt(totalForms.val()) + 1); // Hide add button in case we've hit the max, except we want to add infinitely if ((maxForms.val() != '') && (maxForms.val()-totalForms.val()) <= 0) { addButton.parent().hide(); diff --git a/django/contrib/admin/media/js/inlines.min.js b/django/contrib/admin/media/js/inlines.min.js index cf1c708271..c3336d004d 100644 --- a/django/contrib/admin/media/js/inlines.min.js +++ b/django/contrib/admin/media/js/inlines.min.js @@ -1,6 +1,6 @@ -(function(a){a.fn.formset=function(g){var b=a.extend({},a.fn.formset.defaults,g),l=function(e,f,j){var d=RegExp("("+f+"-\\d+)");f=f+"-"+j;a(e).attr("for")&&a(e).attr("for",a(e).attr("for").replace(d,f));if(e.id)e.id=e.id.replace(d,f);if(e.name)e.name=e.name.replace(d,f)};g=a("#id_"+b.prefix+"-TOTAL_FORMS").attr("autocomplete","off");var h=a("#id_"+b.prefix+"-MAX_NUM_FORMS").attr("autocomplete","off");g=h.val()==""||h.val()-g.val()>0;a(this).each(function(){a(this).not("."+b.emptyCssClass).addClass(b.formCssClass)}); -if(a(this).length&&g){var i;if(a(this).attr("tagName")=="TR"){g=this.eq(0).children().length;a(this).parent().append(''+b.addText+"");i=a(this).parent().find("tr:last a")}else{a(this).filter(":last").after('
'+b.addText+"
");i=a(this).filter(":last").next().find("a")}i.click(function(){var e=a("#id_"+b.prefix+"-TOTAL_FORMS"),f=parseInt(e.val()), -j=a("#"+b.prefix+"-empty"),d=j.clone(true);d.removeClass(b.emptyCssClass).addClass(b.formCssClass).attr("id",b.prefix+"-"+f);d.find("*").filter(function(){var c=a(this);return c.attr("id")&&c.attr("id").search(/__prefix__/)>=0}).each(function(){var c=a(this);c.attr("id",c.attr("id").replace(/__prefix__/g,f))}).end().filter(function(){var c=a(this);return c.attr("name")&&c.attr("name").search(/__prefix__/)>=0}).each(function(){var c=a(this);c.attr("name",c.attr("name").replace(/__prefix__/g,f))}); -if(d.is("tr"))d.children(":last").append('
'+b.deleteText+"
");else d.is("ul")||d.is("ol")?d.append('
  • '+b.deleteText+"
  • "):d.children(":first").append(''+b.deleteText+"");d.find("input,select,textarea,label,a").each(function(){l(this,b.prefix,e.val())});d.insertBefore(a(j));a(e).val(f+1); -h.val()!=""&&h.val()-e.val()<=0&&i.parent().hide();d.find("a."+b.deleteCssClass).click(function(){var c=a(this).parents("."+b.formCssClass);c.remove();b.removed&&b.removed(c);c=a("."+b.formCssClass);a("#id_"+b.prefix+"-TOTAL_FORMS").val(c.length);if(h.val()==""||h.val()-c.length>0)i.parent().show();for(var k=0,m=c.length;k0;a(this).each(function(){a(this).not("."+ +b.emptyCssClass).addClass(b.formCssClass)});if(a(this).length&&g){var i;if(a(this).attr("tagName")=="TR"){g=this.eq(0).children().length;a(this).parent().append(''+b.addText+"");i=a(this).parent().find("tr:last a")}else{a(this).filter(":last").after('");i=a(this).filter(":last").next().find("a")}i.click(function(){var d=a("#id_"+ +b.prefix+"-TOTAL_FORMS"),f=a("#"+b.prefix+"-empty"),e=f.clone(true);e.removeClass(b.emptyCssClass).addClass(b.formCssClass).attr("id",b.prefix+"-"+j);j+=1;e.find("*").filter(function(){var c=a(this);return c.attr("id")&&c.attr("id").search(/__prefix__/)>=0}).each(function(){var c=a(this);c.attr("id",c.attr("id").replace(/__prefix__/g,j))}).end().filter(function(){var c=a(this);return c.attr("name")&&c.attr("name").search(/__prefix__/)>=0}).each(function(){var c=a(this);c.attr("name",c.attr("name").replace(/__prefix__/g, +j))});if(e.is("tr"))e.children(":last").append('
    '+b.deleteText+"
    ");else e.is("ul")||e.is("ol")?e.append('
  • '+b.deleteText+"
  • "):e.children(":first").append(''+b.deleteText+"");e.find("input,select,textarea,label,a").each(function(){l(this,b.prefix,d.val())});e.insertBefore(a(f));a(d).val(parseInt(d.val())+ +1);h.val()!=""&&h.val()-d.val()<=0&&i.parent().hide();e.find("a."+b.deleteCssClass).click(function(){var c=a(this).parents("."+b.formCssClass);c.remove();b.removed&&b.removed(c);c=a("."+b.formCssClass);a("#id_"+b.prefix+"-TOTAL_FORMS").val(c.length);if(h.val()==""||h.val()-c.length>0)i.parent().show();for(var k=0,m=c.length;k0&&e.push(a(f).val())});b.val(URLify(e.join(" "),g))}};a(d.join(",")).keyup(c).change(c).focus(c)})}})(django.jQuery); \ No newline at end of file +(function(a){a.fn.prepopulate=function(d,g){return this.each(function(){var b=a(this);b.data("_changed",false);b.change(function(){b.data("_changed",true)});var c=function(){if(b.data("_changed")!=true){var e=[];a.each(d,function(h,f){a(f).val().length>0&&e.push(a(f).val())});b.val(URLify(e.join(" "),g))}};a(d.join(",")).keyup(c).change(c).focus(c)})}})(django.jQuery);