Django:为什么很多选择框只有侧面

时间:2013-11-11 03:17:18

标签: django django-forms django-admin django-orm

我扩展了群组模型,在那里我添加了许多很多字段,在管理页面中,它喜欢这样:

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对。

有谁知道怎么做?谢谢!

编辑:

enter image description here

我实现了如上所述,多选框实际显示,但它无法保存...(对不起,我正在虚拟机上工作,现在它已离线,所以我必须从屏幕剪辑代码)

3 个答案:

答案 0 :(得分:1)

最新2017

govt_job_post是具有ManyToMany字段资格的模型。

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

admin.site.register(govt_job_post,gjobs)

答案 1 :(得分:0)

要么我忽略了一些让你的情况变得不寻常的东西,要么就是让它变得比它需要的更难。由于您正在使用管理员,因此使用管理员更方便的多选项所需的绝大部分代码已经可用。您需要做的只是声明您的ManyToMany字段,然后将这些字段包含在管理类的filter_horizontal属性中。或filter_vertical如果您希望堆叠框,但屏幕截图显示水平情况。

这本身并不需要管理员的自定义表单。

答案 2 :(得分: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