Formulário de administração do Django para muitos para muitos relação

votos
17

Eu tenho muitos para muitos relação entre 2 tabelas usuários um domínios. Defini esta relação na classe Domínios. Assim, na interface de administração vejo os usuários quando estou vendo domínios. Mas eu não vir Domínios quando estou vendo Users. Como posso conseguir isso.

Publicado 18/03/2009 em 22:55
fonte usuário
Em outras línguas...                            


4 respostas

votos
14

Eu sei que esta é uma discussão mais velho, mas este foi o primeiro resultado que surgiu no google e achei uma resposta melhor era necessário.

Via este relatório django bug que encontrei a melhor maneira de ter o seu ManyToManyField mostrar-se em ambos os modelos:

class Test1(models.Model):
    tests2 = models.ManyToManyField('Test2', blank=True)

class Test2(models.Model):
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)

Eu testei-me e foi muito satisfeito com os resultados.

Respondeu 06/07/2012 em 04:08
fonte usuário

votos
8

A única maneira built-in é através de um InlineModelAdmin, mas você pode usar um ModelForm personalizado com seu ModelAdmin usuário para criar campo para este fim. Veja o código abaixo para configuração simplificada (assume 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)
Respondeu 11/04/2011 em 18:23
fonte usuário

votos
4

Eu acho que o que você está procurando InlineModelAdmin .

Respondeu 19/03/2009 em 02:38
fonte usuário

votos
0

Para as pessoas que ainda topar com isso, pode valer a pena verificar https://github.com/kux/django-admin-extend

Ele fornece um mecanismo para injectar bidireccionais de muitos para muitos campos em ModelAdmins que já foram definidos por outras aplicações.

Respondeu 10/07/2013 em 22:02
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more