Django admin Many2Many настройка виджетов - PullRequest
0 голосов
/ 19 ноября 2010

Мне нужно настроить способ отображения виджета m2m для Django Admin, но я немного озадачен, с чего начать.Я попытался создать подклассы для нескольких виджетов из django.forms и django.contrib.admin.wigets, но, похоже, ничего не работает.

Вот описание того, что я ищу http://i.stack.imgur.com/81AY3.png.

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2010

Это то, что я придумал. Это делает большую часть работы. Однако список не обновляется при добавлении нового элемента, а изменение элемента не перенаправляет обратно на исходную страницу.

/ your_app / forms.py

class ProductForm(forms.ModelForm):
    class Media:
        js = ('js/custom_m2m.js',)

    class Meta:
        model = Product

/ your_media / JS / custom_m2m.js

django.jQuery(function() {
    var $ = django.jQuery;

    // Add a new place holder div to hold the m2m list
    $('div.options div').append('<div class="newdiv"></div>');

    // Assign some variables
    var target = "options"; // <-- Target Field
    var newdiv = $('div.newdiv');
    var next_page = window.location.pathname;
    var add_link = $('div.'+target+' div a#add_id_'+target);
    var edit_img = "/static/media_admin/img/admin/icon_changelink.gif";
    var add_img = "/static/media_admin/img/admin/icon_addlink.gif";

    // Make the placeholder div bit nicer
    newdiv.attr("style", "line-height:20px; margin-left:105px;");

    // Iterate through select options and append them to 'newdiv'
    $('select#id_'+target+' option[selected="selected"]').each(function() {
        newdiv.append('<a href="/admin/shop/option/'+$(this).val()+'/?next='+next_page+'">'+$(this).text()+' <img src="'+edit_img+'" /></a><br />');
    });

    // Add a 'Add new' link after the option list
    add_link.html('<strong>Add new</strong> ' + add_link.html());
    add_link.appendTo(newdiv);

    // Show the 'newdiv' and hide the original dropdown
    $('select#id_'+target).after(newdiv);
    $('select#id_'+target).css("display", "none");
    $('div.'+target+' p[class="help"]').css("display", "none");
});

Как видите, вышеприведенный скрипт использует несколько жестко закодированных путей. Любое улучшение будет полезно.

0 голосов
/ 19 ноября 2010

Это похоже на то, чего можно достичь только с помощью JavaScript. Чтобы добавить свой собственный JavaScript в администратор Django, см. Документацию для определений носителя ModelAdmin .

...