Historia zaczyna się od 2 modeli (User i ClientAccount), które są połączone z dodatkowym modelem M2M.

Możliwe jest utworzenie ClientAccount podczas edycji {x1}}. Strona pokaże popup, który umożliwia utworzenie nowego ClientAccount. Ale problemem jest: czy mogę wyłączyć pola kluczy obce ClientAccount, który łączy się z User? To dość mylące.

Description

Kod tutaj:

class User(models.Model):
    client_accounts = models.ManyToManyField('ClientAccount', related_name='+', through='UserClientAccountM2M', through_fields=('user', 'client_account'))

class ClientAccount(models.Model):
    users = models.ManyToManyField('User', related_name='+', through='UserClientAccountM2M', through_fields=('client_account', 'user'))

class UserClientAccountM2M(models.Model):
    user = models.ForeignKey(User, db_column='user_id')
    client_account = models.ForeignKey(ClientAccount, db_column='client_id')

class UserAdmin(TimeLimitedAdmin):
    class ClientAccountInline(admin.TabularInline):
        model = ClientAccount.users.through
    inlines = [
        ClientAccountInline,
    ]

class ClientAccountAdmin(TimeLimitedAdmin):
    class UserInline(admin.TabularInline):
        model = ClientAccount.users.through
    inlines = [
        UserInline,
    ]

admin.site.register(User, UserAdmin)
0
HKTonyLee 14 sierpień 2014, 11:16

2 odpowiedzi

Najlepsza odpowiedź

Zdaję sobie sprawę, że jest to stare pytanie, ale przyjechałem na nim jako najbardziej istotne pytanie, gdy szukam rozwiązania podobnego problemu (ukryj inline FK tylko w wyskakującym wyskakowaniu). Jestem pewien, że teraz opuściłeś ten problem, ale może inni znajdą go przydatne.

Dodałem poniżej do klasy ModelAdmin, że popup jest dla. Sprawdzam request dla params GET, tylko wtedy, gdy okno dialogowe POPUP zostanie uruchomione, a jeśli są tam, pętlam przez linie i usuń ten, którego nie chcę.

def get_inline_instances(self, request, obj=None):
    inline_instances = super().get_inline_instances(request, obj=None)
    if '_to_field' in request.GET and '_popup' in request.GET:
        # Popup dialog is open.
        unwanted_inline = None
        for inline in inline_instances:
            inline_model_name = inline.opts.model.__name__
            if inline_model_name == 'UnwantedModelName':
                unwanted_inline = inline
        if unwanted_inline:
            inline_instances.remove(unwanted_inline)
    return inline_instances

W twoim przypadku dodałbym powyższe do ClientAccountAdmin, usuwając UserInline.

0
alstr 4 lipiec 2019, 15:27

Jeśli po prostu chcesz ukryć pola M2M w Clientaccount, możesz usunąć linię w admin.py

Ponieważ pojawiają się wyraźnie, że powinien wyświetlić połączenie z użytkownikiem w tabularinline:

class ClientAccountAdmin(TimeLimitedAdmin):
    class UserInline(admin.TabularInline):
        model = ClientAccount.users.through
    #inlines = [UserInline,]

Tam mówisz wyraźnie, że chcesz mieć pole M2M z konta klienta do użytkownika w inline, którego nie chcesz. Pozbyć się tego, a pola znikną

EDYTOWAĆ: Problem polega na tym, że link "Dodaj ..." będzie zawsze odnosić się do strony .../ClientAccount/add/?_popup=1, która używa domyślnego widoku administratora dla tego modelu.

0
gaw 14 sierpień 2014, 09:52