Biorąc pod uwagę model z polami ForeignKeyField (FKF) lub ManyToManyField (MTMF) z obcym do siebie, jak mogę zapobiec self (rekursywny) selekcji w Django Admin (admin).Jak zapobiec selekcji własnej (rekurencyjnej) dla pól FK/MTM w Django Admin
Krótko mówiąc, powinno być możliwe zapobieżenie samodzielnego (rekursywnego) wyboru instancji modelu w administratorze. Dotyczy to edycji istniejących instancji modelu, bez tworzenia nowych instancji.
Weźmy na przykład następujący model artykułu w aplikacji z wiadomościami;
class Article(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField()
related_articles = models.ManyToManyField('self')
Jeśli istnieją 3 Article
instancje (tytuł: A1-3), podczas edycji istniejącego Article
instancji przez administratora pole related_articles
reprezentowany jest domyślnie przez html (stwardnienia) Zaznacz pole, które zawiera listę WSZYSTKIE artykuły (Article.objects.all()
). Użytkownik powinien widzieć i być w stanie wybrać tylko instancje inne niż one, np. Podczas edytowania Article
a1, related_articles
dostępne do wyboru = a2, a3.
Obecnie widzę 3 potencjalne sposoby, aby to zrobić, w kolejności malejącej preferencji;
- zapewnić sposób ustawić queryset zapewniając dostępnych wyborów w polu formularza administratora dla
related_articles
(poprzez wyłączenia filtru zapytań, npArticle.objects.filter(~Q(id__iexact=self.id))
wykluczyć bieżące wystąpienie edytowany z listy related_articles użytkownik może zobaczyć i wybierz z. Tworzenie/ustawienie zestawu kwerend do użycia może wystąpić w konstruktorze (__init__
) niestandardowegoArticle ModelForm
lub, za pomocą jakiejś dynamicznej opcjilimit_choices_to Model
. Wymagałoby to sposobu na pobranie edytowanej instancji do użycia w celu filtrowania. - Zastępuje funkcję
save_model
klasyArticle Model
lubModelAdmin
, aby sprawdzić dla i r emulować się z poziomurelated_articles
przed zapisaniem instancji. Wciąż oznacza to, że użytkownicy administratorzy mogą wyświetlać i wybierać wszystkie artykuły, w tym edytowaną instancję (w przypadku istniejących artykułów). - Filtrowanie samodzielnych odwołań, gdy jest to wymagane do użycia poza adminem, np. szablony.
Idealne rozwiązanie (1) jest obecnie możliwe do zrobienia za pomocą niestandardowych formularzy modelowych poza adminem, ponieważ możliwe jest przekazanie przefiltrowanej zmiennej queryset dla edytowanej instancji do konstruktora formularza modelu. Pytanie brzmi: czy możesz uzyskać w instancji Article
, tzn. "Self" jest edytowane przez administratora przed utworzeniem formularza, aby zrobić to samo.
Możliwe, że podchodzę do tego w niewłaściwy sposób, ale jeśli pozwolisz na zdefiniowanie FKF/MTMF dla tego samego modelu, to powinieneś mieć sposób, aby admin - zrobić właściwą rzecz: - i zapobiec użytkownik sam wybiera siebie, wykluczając go na liście dostępnych wyborów.
Uwaga: Rozwiązanie 2 i 3 są możliwe do zrobienia teraz i są wyposażone, aby spróbować uniknąć tych jak odpowiedziami Idealnie chciałbym, aby uzyskać odpowiedź na rozwiązanie 1.
* Technicznie *, wiem dlaczego [limit_choices_to] (https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey .limit_choices_to) nie może tego zrobić. Praktycznie nie rozumiem, dlaczego nigdy nie został wdrożony. – kojiro
@kojiro - proste rzeczy powinny być proste, zaawansowane rzeczy powinny być możliwe. Nie każda możliwa funkcja musi zostać ściśnięta do limitu_wartość, właśnie dlatego, że zawsze możesz napisać własny kod ModelForm, aby robić cokolwiek chcesz. Jeśli masz sugestię dotyczącą intuicyjnej składni, aby dodać to do limitu_kolei bez komplikowania go, możesz otworzyć zgłoszenie z poprawką i zaproponować to. –