Tik*_*itu 11 django many-to-many django-admin
Django管理员filter_horizontal设置为编辑多对多关系提供了一个很好的小部件.但这是一个特殊的设置,需要一个字段列表,所以它只能在(admin for the)模型中定义ManyToManyField; 如何在(其他模型的管理员)上获取相同的小部件,向后阅读关系?
我的模型看起来像这样(可以随意忽略User/ UserProfile复杂化;但它是真正的用例):
class Site(models.Model):
pass
class UserProfile(models.Model):
user = models.OneToOneField(to=User,unique=True)
sites = models.ManyToManyField(Site,blank=True)
Run Code Online (Sandbox Code Playgroud)
我可以在管理表单上获得一个不错的小部件UserProfile与
filter_horizontal = ('sites',)
Run Code Online (Sandbox Code Playgroud)
但无法看到如何获得Site管理员的等价物.
我也可以通过添加内联来获得部分SiteAdmin,定义为:
class SiteAccessInline(admin_module.TabularInline):
model = UserProfile.sites.through
Run Code Online (Sandbox Code Playgroud)
虽然这是迂回而且不方便; 对于简单地管理多对多关系,小部件根本不直观.
最后,这里描述的一个技巧涉及定义另一个ManyToManyFieldon Site并确保它指向同一个数据库表(并跳过一些箍,因为Django实际上并不是设计为在描述相同数据的不同模型上具有不同的字段).我希望有人能告诉我更清洁的东西.
这是一个(或多或少)整洁的解决方案,感谢http://blog.abiss.gr/mgogoulos/entry/many_to_many_relationships_and以及从http://code.djangoproject.com/ticket/5247获取的Django错误的修复程序
from django.contrib import admin as admin_module
class SiteForm(ModelForm):
user_profiles = forms.ModelMultipleChoiceField(
label='Users granted access',
queryset=UserProfile.objects.all(),
required=False,
help_text='Admin users (who can access everything) not listed separately',
widget=admin_module.widgets.FilteredSelectMultiple('user profiles', False))
class SiteAdmin(admin_module.ModelAdmin):
fields = ('user_profiles',)
def save_model(self, request, obj, form, change):
# save without m2m field (can't save them until obj has id)
super(SiteAdmin, self).save_model(request, obj, form, change)
# if that worked, deal with m2m field
obj.user_profiles.clear()
for user_profile in form.cleaned_data['user_profiles']:
obj.user_profiles.add(user_profile)
def get_form(self, request, obj=None, **kwargs):
if obj:
self.form.base_fields['user_profiles'].initial = [ o.pk for o in obj.userprofile_set.all() ]
else:
self.form.base_fields['user_profiles'].initial = []
return super(SiteAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这使用与filter_horizontal设置相同的小部件,但硬编码到表单中.
| 归档时间: |
|
| 查看次数: |
2794 次 |
| 最近记录: |