2013-11-11 1 views
1

я расширил модель группы, где я добавил некоторые manytomany поля, а также на странице администратора, он любит это:Джанго: почему manytomany окно выбора есть только на стороне

enter image description here

Однако, что Я ожидал, что это:

enter image description here

Вот как я реализовал поле M2M:

class MyGroup(ProfileGroup): 
    mobile = models.CharField(max_length = 15) 
    email = models.CharField(max_length = 15) 
    c_annotates = models.ManyToManyField(Annotation, verbose_name=_('annotation'), blank=True, null=True) 
    c_locations = models.ManyToManyField(Location, verbose_name=_('locations'), blank=True, null=True) 

И в базе данных есть реляционная форма, содержащая пары group_id и location_id.

Есть ли кто-нибудь, кто знает, как это сделать? Благодаря!

EDIT:

enter image description here

Я реализовал как и выше, множественный выбор коробки фактически показывает вверх, но он не может спасти ... (К сожалению, я работал на виртуальную машину, и теперь он автономен, поэтому я должен закрепить код с экрана)

+0

Вы используете неправильный виджет: http://stackoverflow.com/questions/1698435/django-multi-select-widget – karthikr

+0

Вы будете нужно также показать свой класс администратора. –

+0

Привет, ребята, я реализовал виджет, как показано в редактировании, но выбранные местоположения не могут быть сохранены. Большое спасибо. – Robert

ответ

0

Проблема решена. Теперь он может сохранить поле множественного выбора.

class GroupAdminForm(forms.ModelForm): 
    users = forms.ModelMultipleChoiceField(queryset=User.objects.all(), 
             widget=FilteredSelectMultiple('Users', False), 
             required=False) 
    locations = forms.ModelMultipleChoiceField(queryset=Location.objects.all(), 
             widget=FilteredSelectMultiple('Location', False), 
             required=False) 
    class Meta: 
     model = Group 

    def __init__(self, *args, **kwargs): 
     instance = kwargs.get('instance', None) 
      if instance is not None: 
      initial = kwargs.get('initial', {}) 
      initial['users'] = instance.user_set.all() 
      initial['locations'] = instance.c_locations.all() 
      kwargs['initial'] = initial 
     super(GroupAdminForm, self).__init__(*args, **kwargs) 

    def save(self, commit=True): 
     group = super(GroupAdminForm, self).save(commit=commit) 

     if commit: 
      group.user_set = self.cleaned_data['users'] 
      group.locations = self.cleaned_data['locations'] 
     else: 
      old_save_m2m = self.save_m2m 
      def new_save_m2m(): 
       old_save_m2m() 
       group.user_set = self.cleaned_data['users'] 
       group.location_set = self.cleaned_data['locations'] 
      self.save_m2m = new_save_m2m 
     return group 
+0

Это похоже на серьезный перебор, если вы используете эту форму в админке. Просто используйте встроенное поведение 'filter_horizontal'. –

+0

Действительно? Позвольте мне заглянуть в filter_horizontal ... – Robert

+0

Он разработан, чтобы дать вам приятный интерфейс для стандартных полей 'ManyToMany'.Там, где это сложно, вы пытаетесь использовать его вне администратора, поскольку это зависит от некоторых пользовательских Javascript и CSS. –

0

Либо я упускаю из виду что-то, что делает вашу ситуацию необычной, или вы делаете ее сложнее, чем она должна быть. Поскольку вы используете администратора, подавляющее большинство кода, необходимое для использования более удобных мультиселектов администратора, уже доступно. Все, что вам нужно сделать, это объявить поля ManyToMany, как и у вас, а затем включить эти поля в атрибут filter_horizontal вашего администратора. Или filter_vertical, если вы хотите, чтобы ящики были сложены, но ваш скриншот показывает горизонтальный регистр.

Это само по себе не требует пользовательской формы для вашего администратора.

+0

Я попытался добавить filter_horizontal в MyGroupAdmin (GroupAdmin), но множественные варианты не могут сохранить снова. .. – Robert

+0

Я думаю, что, поскольку я расширяю GroupAdmin в contrib.auth, но не на странице администратора для пользовательских моделей, это было бы более сложным. – Robert

0

последние 2017

govt_job_post является модель, имеющий квалификацию в области ManyToMany.

class gjobs(admin.ModelAdmin): 
    filter_horizontal = ('qualification',) 

admin.site.register (govt_job_post, gjobs)

Смежные вопросы