我扩展了群组模型,在那里我添加了许多很多字段,在管理页面中,它喜欢这样:
但是,我的预期是:
以下是我实施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对。
有谁知道怎么做?谢谢!
编辑:
我实现了如上所述,多选框实际显示,但它无法保存...(对不起,我正在虚拟机上工作,现在它已离线,所以我必须从屏幕剪辑代码)
答案 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