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.
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)
2 odpowiedzi
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
.
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.
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.