Django 1.7 entfernt die Schaltfläche Hinzufügen aus dem Inline-Formular

7

Ich habe Probleme, eine (wahrscheinlich) ziemlich einfache Aufgabe zu erreichen. Ich habe voll modifizierbare Modelle (Prodotto, Comune), die als "addierbare" Felder angezeigt werden, wie im Bild unten gezeigt. Was ich lieber nicht sehen möchte, ist der + (add) -Button für solche Felder, um somit ihre "addierbare" Eigenschaft in dieser Form zu entfernen. Ich habe versucht, has_add_permission = False in den beiden Modellen zu setzen, aber es würde es unmöglich machen, solchen Modellen vollständig neue Objekte hinzuzufügen, nicht nur in dieser Form.

Wie kann ich das tun?

BEARBEITEN: Um meine Bedürfnisse zu verdeutlichen, möchte ich NICHT die "+" s neben den Feldern der FK-Modelle haben, aber ich möchte noch um ganz neue Inlines hinzufügen zu können. Um so klar wie möglich zu sein, wie ich in einem Kommentar geschrieben habe, unter Berücksichtigung eines solchen Szenarios: Ссылка Ich brauche nur die "+" s neben Gruppen und Land entfernt.

VORHANDENER CODE:

models.py (der betroffenen Anwendung):

%Vor%

admin.py (der betroffenen Anwendung):

%Vor%

Die Admin-Oberfläche dieser App erzeugt dies:

Verknüpfungslinks 1 und 2 sind diejenigen, die ich entfernen muss. Sie werden auf Spalten (FKs) innerhalb meiner Inline-Klassen verwiesen. Shortcut-Links 3 und 4 sind beizubehalten, da sie sich auf die Inlines selbst beziehen.

    
Seether 17.10.2014, 13:12
quelle

3 Antworten

9

Ich denke, das ist eine weniger hacky Lösung als die, mit der Sie endete. Es hat jedenfalls für mich funktioniert.

Im Grunde ist es das Inline-Äquivalent zu dem, was Sie mit dem Überschreiben der Methode get_form von ModelAdmin vorgeschlagen haben. Hier überschreiben wir get_formset in der Inline-Klasse, rufen das Formular vom Formset ab und führen dasselbe aus. Scheint gut zu funktionieren, zumindest in 1.9, die ich benutze.

%Vor%     
thegiffman 01.06.2016, 02:26
quelle
11

Um die Option "Weitere hinzufügen" zu entfernen, fügen Sie bitte die folgende Methode in der Admin-Inline-Klasse hinzu.

%Vor%

Ähnlich, wenn Sie "Löschen" deaktivieren möchten Option, fügen Sie die folgende Methode in der Admin-Inline-Klasse hinzu.

%Vor%     
Sandy 14.04.2016 07:15
quelle
4

Nach ein paar intensiven Tagen habe ich endlich einen Weg gefunden, das zu erreichen.

Ein einfacher Trick wie dies ist mehr als genug, um dieses Problem in ModelAdmin-Unterklassen zu beheben (siehe ClienteAdmin in meinem Code oben), also hier ist die Klassenversion, ohne Fähigkeiten für "Prodotto" Feld hinzuzufügen:

%Vor%

Der wahre Schmerz kommt beim Umgang mit Inline-Klassen (TabularInline, StackedInline), da die Funktion get_form () überhaupt nicht aufgerufen wird, so dass der vorherige Weg nicht funktioniert.

Alle meine bisherigen Versuche zu erklären, würde zu lange dauern, und ich bin wahrscheinlich noch nicht gut genug mit Django, um zu erklären, warum sie nicht funktioniert haben. Gehen wir also direkt zu der Lösung, die eigentlich gar nicht so kompliziert ist.

Ich habe das Widget django.contrib.admin.widgets.RelatedFieldWidgetWrapper unterklassiert und seine Rendermethode überschrieben, sodass es den Anker "add-another" nicht an die Ausgabe anfügt. Einfach gemacht, indem Sie ein paar Zeilen auskommentieren. Nachdem dies geschehen ist, hat Monkeypatching das ursprüngliche RelatedFieldWidgetWrapper mit meiner eigenen Version ( django.contrib.admin.widgets.RelatedFieldWidgetWrapper = NoAddingRelatedFieldWidgetWrapper ) den Trick gemacht.

Damit es funktioniert, musste ich natürlich die Importzeile in admin.py hinzufügen:

aus .widgets importieren NoAddingRelatedFieldWidgetWrapper

widgets.py

%Vor%

Zum Zweck der Fertigstellung, hier ist die endgültige Version der verwandten admin.py:

admin.py

%Vor%

Soll irgendjemand eine bessere Lösung herausbringen, nehme ich sie gerne an meine Stelle.

    
Seether 20.10.2014 15:54
quelle

Tags und Links