Frage Django Admin Formular für viele zu viele Beziehung


Ich habe eine viele zu viele Beziehung zwischen 2 Tabellen Benutzer und Domains. Ich habe diese Beziehung in der Klasse Domains definiert. In der Admin-Oberfläche sehe ich die Benutzer, wenn ich Domains betrachte. Aber ich sehe keine Domains, wenn ich Nutzer ansehe. Wie kann ich das erreichen?


17
2018-03-18 21:55


Ursprung


Antworten:


Ich weiß, dass dies ein älterer Thread ist, aber dies war das erste Ergebnis, das bei Google aufkam und ich dachte, eine bessere Antwort wäre notwendig.

Über dieser Django-Fehlerbericht Ich habe den besten Weg gefunden, Ihr ManyToManyField auf beiden Modellen erscheinen zu lassen:

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

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

Ich habe es selbst getestet und war sehr zufrieden mit den Ergebnissen.


14
2017-07-06 03:08



Der einzige integrierte Weg ist über einen InlineModelAdmin, aber Sie können ein benutzerdefiniertes ModelForm mit Ihrem User ModelAdmin verwenden, um ein Feld für diesen Zweck zu erstellen. Siehe den nachstehenden Code für die vereinfachte Einrichtung (angenommen 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)

8
2018-04-11 17:23



Ich denke, was du suchst ist InlineModelAdmin.


4
2018-03-19 01:38



Für Leute, die immer noch darauf stoßen, könnte es eine Überprüfung wert seinhttps://github.com/kux/django-admin-extend

Es bietet einen Mechanismus zum Eingeben bidirektionaler Viele-zu-Viele-Felder in ModelAdmins, die bereits von anderen Apps definiert wurden.


0
2017-07-10 21:02