Ich habe ein Modell auf der Admin-Site registriert. Eines seiner Felder ist ein langer Zeichenfolgenausdruck. Ich möchte der Seite zum Hinzufügen / Aktualisieren dieses Modells im Administrator benutzerdefinierte Formularfelder hinzufügen, die auf der Grundlage dieser Feldwerte den Ausdruck für lange Zeichenfolgen erstellen und im entsprechenden Modellfeld speichern.
Wie kann ich das machen?
UPDATE: Grundsätzlich erstelle ich einen mathematischen oder Zeichenfolgenausdruck aus Symbolen. Der Benutzer wählt Symbole aus (dies sind die benutzerdefinierten Felder, die nicht Teil des Modells sind). Wenn er auf Speichern klickt, erstelle ich eine Zeichenfolgenausdrucksdarstellung aus dem Liste der Symbole und speichern Sie es in der DB. Ich möchte nicht, dass die Symbole Teil des Modells und der Datenbank sind, sondern nur der endgültige Ausdruck.
fields = '__all__'
in IhrerMeta
Klasse hinzufügen , sonst beschwert sich Django:Creating a ModelForm without either the 'fields' attribute or the 'exclude' attribute is deprecated
YourModelAdmin.list_display[0], 'extra_field' is not a callable or an attribute of 'YourModelAdmin' or found in the model 'YourModel'.
AttributeError: Unable to lookup "extra_field"...
, versuchen Sielabel
, derextra_field
Definition eine hinzuzufügen . Es scheint, dass Django versucht, die Bezeichnung dafür zu "erraten", indem er sich dieModel
und dieModelAdmin
für eine solche Attributdefinition ansieht .Unknown field(s) (extra_field) specified for YourModel. Check fields/fieldsets/exclude attributes of class YourModelAdmin.
. Die Problemumgehung dafür istextra_field = forms.CharField(widget=forms.HiddenInput())
Es ist möglich, dies im Administrator zu tun, aber es gibt keinen sehr einfachen Weg dorthin. Außerdem möchte ich Ihnen raten, die meisten Geschäftslogiken in Ihren Modellen beizubehalten, damit Sie nicht vom Django-Administrator abhängig sind.
Vielleicht wäre es einfacher (und vielleicht sogar noch besser), wenn Sie die beiden getrennten Felder in Ihrem Modell hätten. Fügen Sie dann Ihrem Modell eine Methode hinzu, die sie kombiniert.
Beispielsweise:
Dann können Sie im Admin das
combined_fields()
Feld als schreibgeschütztes Feld hinzufügen :Wenn Sie das
combined_fields
in der Datenbank speichern möchten, können Sie es auch speichern, wenn Sie das Modell speichern:quelle
save()
Methode des Modells in der Datenbank speichern und die Aktualisierungen meiner Antwort überprüfen.Django 2.1.1 Die primäre Antwort brachte mich auf halbem Weg zur Beantwortung meiner Frage. Es hat mir nicht geholfen, das Ergebnis in einem Feld in meinem tatsächlichen Modell zu speichern. In meinem Fall wollte ich ein Textfeld, in das ein Benutzer Daten eingeben kann. Wenn dann ein Speichern erfolgt, werden die Daten verarbeitet und das Ergebnis in ein Feld im Modell eingegeben und gespeichert. Während die ursprüngliche Antwort zeigte, wie der Wert aus dem zusätzlichen Feld abgerufen werden kann, zeigte sie zumindest in Django 2.1.1 nicht, wie er wieder im Modell gespeichert werden kann
Dadurch wird der Wert aus einem ungebundenen benutzerdefinierten Feld übernommen, verarbeitet und in meinem realen Beschreibungsfeld gespeichert:
quelle
Sie können jederzeit eine neue Admin-Vorlage erstellen und in Ihrer admin_view das tun, was Sie benötigen (überschreiben Sie die Admin-Add-URL zu Ihrer admin_view):
quelle
Wenn Sie unbedingt nur das kombinierte Feld im Modell und nicht die beiden separaten Felder speichern möchten, können Sie Folgendes tun:
form
Attribut auf IhrerModelAdmin
( https://docs.djangoproject.com/de/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form )save_formset
Methode auf IhremModelAdmin
( https://docs.djangoproject.com/de/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model )Ich habe so etwas noch nie gemacht, daher bin ich mir nicht ganz sicher, wie es funktionieren wird.
quelle