2

我扩展了组模型,在其中添加了一些多对多字段,在管理页面中,它喜欢这样:

在此处输入图像描述

然而,我所期望的是:

在此处输入图像描述

以下是我实现 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 对的关系形式。

有没有人知道怎么做?谢谢!

编辑:

在此处输入图像描述

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

4

3 回答 3

4

最新 2017

govt_job_post是具有多对多领域资格的模型。

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

admin.site.register(govt_job_post,gjobs)

于 2017-04-19T09:53:09.167 回答
1

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

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

于 2013-11-11T05:21:07.497 回答
1

问题解决了。它现在可以保存多项选择字段。

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
于 2013-11-11T05:24:23.463 回答