Benutzerdefiniertes Feld list_editable in der Änderungsliste von django admin, das nicht direkt einem Modellfeld entspricht

7

Angenommen, mein Modell sieht so aus (dies ist ein vereinfachtes Beispiel):

%Vor%

Die Angabe des Namens als einzelne Spalte in der Admin-Änderungsliste ist einfach. Ich benötige jedoch ein einzelnes, editierbares "Name" -Feld, das von der Listenseite bearbeitet werden kann, das ich analysieren kann, um die Modellfeldwerte zu extrahieren und einzustellen. Das Parsen ist kein Problem. Ich frage mich nur, wie man ein editierbares Formularfeld auf der Listenseite hat, das nicht direkt einem Modellfeld entspricht.

    
Ben Roberts 07.10.2013, 19:58
quelle

3 Antworten

19

Das solltest du in Python mit ein bisschen Arbeit machen können. Im Grunde müssen Sie das get_changelist_form Methode für die admin-Klasse, um sie anzuweisen, ein benutzerdefiniertes Formular anstelle eines Standardwerts ModelForm für Ihre Instanzen zu verwenden, dann den Wert des benutzerdefinierten Felds ordnungsgemäß zu initialisieren (am bequemsten in der __init__ -Methode des Formulars) und das Verhalten save zu spezialisieren dieses Formulars, um die Werte first_name und last_name festzulegen.

So etwas sollte ein Anfang sein:

%Vor%

Sie müssen auch einen list_editable -Wert deklarieren, der zu True wird, wenn er als Boolescher Wert getestet wird - einige der Verwaltungskurzschlüsse ohne Verwendung des Formsets, wenn list_editable nicht als True auswertet.

Wenn Sie keine anderen Felder bearbeiten möchten, wird dies komplizierter. Die Klassenvalidierung erfordert, dass alles in der list_editable -Sequenz ein editierbares Feld ist, das auch in list_display deklariert ist und kein Anzeige-Link-Feld ist. Ich denke, die Optionen dort sind, entweder die Methode changelist_view der Admin-Klasse zu überschreiben, um die vollständige Verarbeitung zu verwenden, selbst wenn list_editable nicht wahr ist, oder eine benutzerdefinierte Unterklasse von list oder tuple zu definieren, die zu True auswertet. selbst wenn es leer ist, kann es die Validierung bestehen. Ersteres erfordert eine Wiederholung von viel Standard-Code und eine erhebliche Erhöhung der Wartungslast, wenn Sie ein Upgrade durchführen, während Letzteres ein nicht intuitiver Hack ist und mich bei unerwarteten Konsequenzen überhaupt nicht überraschen würde.

Es gibt auch keine guten Optionen, also hoffe ich, dass Sie mindestens ein anderes Feld haben, das sinnvollerweise in list_editable enthalten ist.

    
Peter DeGlopper 11.10.2013, 03:29
quelle
2

Ich habe gerade versucht, das Problem im Admin schnell nachzubilden. Es scheint, dass die Admin-Validierung für ein Feld fehlschlägt, das sich in list_editable befindet und nicht im Modell definiert ist. Kurz gesagt, die Antwort auf Ihre Frage scheint nein zu sein.

Das bedeutet jedoch nicht, dass es nicht machbar ist. Mit ein wenig Javascript können Sie X-editable

verwenden

(oder rollen Sie Ihre eigenen), und machen Sie die Spalte "Name" editierbar. Erstellen Sie eine Ansicht, um die Daten zu überprüfen und im Modell zu speichern. Legen Sie den X-editierbaren Feld-URL-Parameter fest, der an diese URL gesendet werden soll. Natürlich schmücken Sie Ihre Ansicht mit login_required / permissions_required etc, um sicherzustellen, dass niemand sonst die Daten bearbeiten kann.

    
cazgp 07.10.2013 20:16
quelle
0

Ergänzung zu @Peter DeGlopper Antwort: Sie können ein anderes Modellfeld in list_editable hinzufügen (zum Beispiel last_name ) und dann change_list.html überschreiben (sehen Sie sich diese Antwort an So überschreiben Sie Vorlagen und fügen am Ende der Datei einen Javascript-Code hinzu: templates / admin / Ihre_Anwendung /person/change_list.html :

%Vor%     
Nikita Isaev 12.05.2017 12:06
quelle

Tags und Links