在 Django admin 中编辑组对象时将用户对象分配给组 [英] Assign User-objects to a Group while editing Group-object in Django admin
问题描述
在用户对象(编辑用户)的默认 Django 管理视图中,可以编辑用户的组成员身份.如果我也想反过来呢?IE.在群组编辑页面中,可以选择属于正在编辑的群组的用户.
正如我所看到的,Django 没有从 Group 到 User 对象的 ManyToMany 映射,这使得(?)无法为这种特殊情况实现 ModelAdmin 类.如果我可以创建一个额外的 UsersOfGroup 模型类并在 Django 的 Group 模型的 ManyToMany 字段中使用它作为直通属性,那么可能会有一种方法.
任何想法,这是否可以使用 ModelAdmin 技巧来实现,还是我只需要为编辑组制作自定义视图?
我已经检查了另外两个问题,但它们的作用并不完全相同:
和
更新:克里斯的答案几乎就在那里.:) 该组引用了用户集,但它被称为 user_set,而不是 users.以下是我所做的更改:
如果 self.instance 和 self.instance.pk:self.fields['users'].initial = self.instance.user_set.all()
和
如果 group.pk:group.user_set = self.cleaned_data['users']
yourapp/admin.py
从 django 导入表单从 django.contrib 导入管理员从 django.utils.translation 导入 ugettext_lazy 作为 _从 django.contrib.admin.widgets 导入 FilteredSelectMultiple从 django.contrib.auth.models 导入用户、组类 GroupAdminForm(forms.ModelForm):用户 = forms.ModelMultipleChoiceField(queryset=User.objects.all(),必需=假,小部件=FilteredSelectMultiple(verbose_name=_('用户'),is_stacked=假))元类:模型 = 组def __init__(self, *args, **kwargs):super(GroupAdminForm, self).__init__(*args, **kwargs)如果 self.instance 和 self.instance.pk:self.fields['users'].initial = self.instance.users.all()def保存(自我,提交=真):group = super(GroupAdminForm, self).save(commit=False)如果提交:group.save()如果组.pk:group.users = self.cleaned_data['users']self.save_m2m()返回组类 GroupAdmin(admin.ModelAdmin):表格 = GroupAdminFormadmin.site.unregister(组)admin.site.register(组,GroupAdmin)
In the default Django admin view for user-object (edit user) one can edit the user's group memberships. What if I wanted this the other way around also? I.e. in the group editing page one could select the users that belong to the group being edited.
As I see this, Django doesn't have a ManyToMany mapping from Group to User object which makes it impossible(?) to implement a ModelAdmin class for this particular case. If I could make an additional UsersOfGroup model class and use it in the Django's Group model's ManyToMany field as a through-attribute, there could be a way.
Any ideas, is this possible to implement using ModelAdmin tricks or do I just have to make a custom view for editing groups?
I have checked these two other questions, but they don't quite do the same thing:
Assigning a group while adding user in admin
and
Show group membership in admin
Updated: The answer from Chris was almost there. :) The group has a reference to the users set, but it's called user_set, not users. So these are the changes I made:
if self.instance and self.instance.pk:
self.fields['users'].initial = self.instance.user_set.all()
and
if group.pk:
group.user_set = self.cleaned_data['users']
yourapp/admin.py
from django import forms
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.contrib.auth.models import User, Group
class GroupAdminForm(forms.ModelForm):
users = forms.ModelMultipleChoiceField(
queryset=User.objects.all(),
required=False,
widget=FilteredSelectMultiple(
verbose_name=_('Users'),
is_stacked=False
)
)
class Meta:
model = Group
def __init__(self, *args, **kwargs):
super(GroupAdminForm, self).__init__(*args, **kwargs)
if self.instance and self.instance.pk:
self.fields['users'].initial = self.instance.users.all()
def save(self, commit=True):
group = super(GroupAdminForm, self).save(commit=False)
if commit:
group.save()
if group.pk:
group.users = self.cleaned_data['users']
self.save_m2m()
return group
class GroupAdmin(admin.ModelAdmin):
form = GroupAdminForm
admin.site.unregister(Group)
admin.site.register(Group, GroupAdmin)
这篇关于在 Django admin 中编辑组对象时将用户对象分配给组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!