我在 2 个表用户和域之间有多对多的关系。我在 Domains 类中定义了这种关系。因此,在管理界面中,当我查看域时,我会看到用户。但是当我查看用户时,我看不到域。我怎样才能做到这一点。
Anand
问问题
20161 次
4 回答
16
我知道这是一个较旧的线程,但这是谷歌上出现的第一个结果,我认为有必要提供更好的答案。
通过这个 django 错误报告,我找到了让您的 ManyToManyField 出现在两个模型上的最佳方法:
class Test1(models.Model):
tests2 = models.ManyToManyField('Test2', blank=True)
class Test2(models.Model):
tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)
我自己测试过,对结果非常满意。
于 2012-07-06T03:08:22.023 回答
10
唯一的内置方法是通过 InlineModelAdmin,但您可以使用自定义 ModelForm 和您的 User ModelAdmin 来为此创建字段。请参阅下面的代码以简化设置(假设users = ManyToManyField(related_name='domains')
)。
### yourapp/admin.py ###
from django import forms
from django.contrib import admin
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from django.contrib.admin.widgets import FilteredSelectMultiple
from .models import Domain
class DomainAdmin(admin.ModelAdmin):
filter_horizonal = ('users',)
class UserAdminForm(forms.ModelForm):
domains = forms.ModelMultipleChoiceField(
queryset=Domain.objects.all(),
required=False,
widget=FilteredSelectMultiple(
verbose_name=_('Domains'),
is_stacked=False
)
)
class Meta:
model = User
def __init__(self, *args, **kwargs):
super(UserAdminForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['domains'].initial = self.instance.domains.all()
def save(self, commit=True):
user = super(UserAdminForm, self).save(commit=False)
user.domains = self.cleaned_data['domains']
if commit:
user.save()
user.save_m2m()
return user
class UserAdmin(admin.ModelAdmin):
form = UserAdminForm
admin.site.register(Domain, DomainAdmin)
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
于 2011-04-11T17:23:16.597 回答
5
我认为您正在寻找的是InlineModelAdmin。
于 2009-03-19T01:38:31.567 回答
0
对于仍然遇到此问题的人,可能值得检查<a href="https://github.com/kux/django-admin-extend" rel="nofollow">https://github.com/kux /django-admin-扩展
它提供了一种机制,用于在已经由其他应用程序定义的 ModelAdmins 中注入双向多对多字段。
于 2013-07-10T21:02:02.517 回答