Django: виджет ManyToMany не будет отображаться в виде двойного списка - PullRequest
0 голосов
/ 01 апреля 2012

Привет, люди из Stackoverflow,

Я хотел бы изменить виджет m2m на страницах администратора (а позже и на реальном сайте django) на более удобный для пользователя двойной список (например, one * 1004).*).

Я понимаю, что django.contrib.admin.widgets.FilteredSelectMultiple может сделать это для меня.Однако у меня проблемы с тем, чтобы заставить его работать.Я добавил код ниже в мой admin.py, но виджет не меняется, когда я просматриваю модель в приложении администратора.

Я пытался перенести код из здесь .Каждый SupplierProfile должен подключаться к одной или нескольким странам из модели WorldBorder (на примере GeoDjango )

Где в коде изъян?Я не понимаю, почему это не будет отображаться.Спасибо за вашу помощь!

from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.gis import admin
from django.utils.translation import ugettext_lazy as _

from apps.profile.models import (UserProfile,
                                  SupplierProfile)
from apps.gis_data.models import WorldBorder


class WorldBorderAdmin(admin.ModelAdmin):
    filter_horizonal = ('name',)

class SupplierProfileAdminForm(forms.ModelForm):
    distribution_location_country = forms.ModelMultipleChoiceField(
        queryset = WorldBorder.objects.all(), 
            required = False,
            widget = FilteredSelectMultiple(
            verbose_name = _('Distribution Country'),
            is_stacked=False
        )
     )

    class Meta:
        model = SupplierProfile

    def __init__(self, *args, **kwargs):
        super(SupplierProfileAdminForm, self).__init__(*args, **kwargs)

        if self.instance:
          self.fields['distribution_location_country'].initial = self.instance.distribution_location_country.all()

    def save(self, commit=True):
        profile = super(SupplierProfileAdminForm, self).save(commit=False)

        profile.distribution_location_country = self.cleaned_data['distribution_location_country']

        if commit:
            profile.save()
            profile.save_m2m()

        return profile

class SupplierProfileAdmin(admin.ModelAdmin):
    form = SupplierProfileAdminForm

admin.site.register(SupplierProfile, admin.OSMGeoAdmin)

Обновлен код admin.py

Можно ли определить двойной список, как указано ниже?«distribution_location_country» - это поле m2m в моем Профиле поставщика.По какой-то причине это все еще не проходит.

from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.gis import admin

class SupplierProfileAdmin(admin.OSMGeoAdmin):
    filter_horizontal = ('distribution_location_country', )

admin.site.register(SupplierProfile, SupplierProfileAdmin)

1 Ответ

1 голос
/ 01 апреля 2012

Ваша строка register, похоже, неверна:

admin.site.register(SupplierProfile, admin.OSMGeoAdmin)

не регистрирует настроенную SupplierProfileAdmin для вашей модели.

Возможно, вам нужен базовый класс SupplierProfileAdmin будет OSMGeoAdmin вместо ModelAdmin:

class SupplierProfileAdmin(admin.OSMGeoAdmin):
    form = SupplierProfileAdminForm

и вашей регистрационной строкой будет

admin.site.register(SupplierProfile, SupplierProfileAdmin)

Кроме того, я не уверен в этом, но вы могли бы простобыть в состоянии использовать

filter_horizonal = ('name_of_the_m2m_field_on_the_model', )

на вашем SupplierProfileModel вместо этого настраиваемого поля в форме?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...