Django Admin Form适用于多对多关系

时间:2009-03-18 21:55:25

标签: django django-models django-admin

我有两个表用户和域之间的多对多关系。 我在Domains类中定义了这种关系。 因此,在管理界面中,我在查看域时看到用户。 但是当我查看用户时,我没有看到域名。 我怎样才能做到这一点。

4 个答案:

答案 0 :(得分:14)

我知道这是一个较老的帖子,但这是谷歌上出现的第一个结果,我认为有必要提供更好的答案。

通过this django bug report我找到了让你的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)

我自己测试过,对结果非常满意。

答案 1 :(得分:8)

唯一的内置方式是通过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)

答案 2 :(得分:4)

我认为你要找的是InlineModelAdmin

答案 3 :(得分:0)

对于仍然遇到此问题的人,可能值得查看https://github.com/kux/django-admin-extend

它提供了一种机制,用于在ModelAdmins中注入已由其他应用程序定义的双向多对多字段。