Wie kann ich die raffinierten JavaScript-Widgets für Datum und Uhrzeit verwenden, die der Standardadministrator für meine benutzerdefinierte Ansicht verwendet?
Ich habe die Dokumentation zu Django-Formularen durchgesehen und sie erwähnt kurz django.contrib.admin.widgets, aber ich weiß nicht, wie ich sie verwenden soll.
Hier ist meine Vorlage, auf die ich sie anwenden möchte.
<form action="." method="POST">
<table>
{% for f in form %}
<tr> <td> {{ f.name }}</td> <td>{{ f }}</td> </tr>
{% endfor %}
</table>
<input type="submit" name="submit" value="Add Product">
</form>
Ich denke auch, dass ich selbst keine Ansicht für dieses Formular geschrieben habe. Ich verwende eine generische Ansicht. Hier ist der Eintrag aus der url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
Und ich bin relevant neu in der ganzen Django / MVC / MTV-Sache, also bitte gehen Sie einfach ...
Antworten:
Die zunehmende Komplexität dieser Antwort im Laufe der Zeit und die vielen erforderlichen Hacks sollten Sie wahrscheinlich davor warnen, dies überhaupt zu tun. Es basiert auf undokumentierten internen Implementierungsdetails des Administrators, wird in zukünftigen Versionen von Django wahrscheinlich wieder kaputt gehen und ist nicht einfacher zu implementieren, als nur ein anderes JS-Kalender-Widget zu finden und dieses zu verwenden.
Das heißt, hier ist, was Sie tun müssen, wenn Sie entschlossen sind, diese Arbeit zu machen:
Definieren Sie Ihre eigene ModelForm-Unterklasse für Ihr Modell (am besten in forms.py in Ihrer App) und weisen Sie es an, AdminDateWidget / AdminTimeWidget / AdminSplitDateTime zu verwenden (ersetzen Sie 'mydate' usw. durch die richtigen Feldnamen aus Ihrem Modell):
Ändern Sie Ihre URLconf so, dass 'form_class': ProductForm anstelle von 'model': Product an die generische Ansicht create_object übergeben wird (dies bedeutet natürlich "from my_app.forms import ProductForm" anstelle von "from my_app.models import Product").
Fügen Sie im Kopf Ihrer Vorlage {{form.media}} ein, um die Links zu den Javascript-Dateien auszugeben.
Und der hackige Teil: Die Widgets für Datum und Uhrzeit des Administrators setzen voraus, dass das i18n JS-Zeug geladen wurde, und erfordern auch core.js, stellen jedoch keines automatisch bereit. In Ihrer Vorlage über {{form.media}} benötigen Sie also:
Möglicherweise möchten Sie auch das folgende Admin-CSS verwenden (danke Alex, dass Sie dies erwähnt haben):
Dies bedeutet, dass sich Djangos Administratormedien (ADMIN_MEDIA_PREFIX) unter / media / admin / befinden. Sie können dies für Ihr Setup ändern. Idealerweise verwenden Sie einen Kontextprozessor, um diese Werte an Ihre Vorlage zu übergeben, anstatt sie fest zu codieren. Dies würde jedoch den Rahmen dieser Frage sprengen.
Dies erfordert auch, dass die URL / my_admin / jsi18n / manuell mit der Ansicht django.views.i18n.javascript_catalog (oder null_javascript_catalog, wenn Sie I18N nicht verwenden) verbunden ist. Sie müssen dies selbst tun, anstatt die Administratoranwendung zu durchlaufen, damit Sie darauf zugreifen können, unabhängig davon, ob Sie beim Administrator angemeldet sind (danke Jeremy, dass Sie darauf hingewiesen haben). Beispielcode für Ihre URLconf:
Wenn Sie Django 1.2 oder höher verwenden, benötigen Sie zusätzlichen Code in Ihrer Vorlage, damit die Widgets ihre Medien finden können:
Danke lupefiasco für diesen Zusatz.
quelle
Da die Lösung hackisch ist, denke ich, dass die Verwendung Ihres eigenen Datums- / Zeit-Widgets mit etwas JavaScript praktikabler ist.
quelle
Ja, am Ende habe ich die / admin / jsi18n / url überschrieben.
Folgendes habe ich in meiner urls.py hinzugefügt. Stellen Sie sicher, dass es über der / admin / url liegt
Und hier ist die von mir erstellte Funktion i18n_javascript.
quelle
Ich verweise häufig auf diesen Beitrag und stelle fest, dass die Dokumentation eine etwas weniger hackige Methode zum Überschreiben von Standard-Widgets definiert.
( Die __init__- Methode von ModelForm muss nicht überschrieben werden. )
Sie müssen jedoch weiterhin JS und CSS entsprechend verkabeln, wie Carl erwähnt.
forms.py
Referenzfeldtypen die Standardformularfelder zu finden.
quelle
Mein Kopfcode für die Version 1.4 (einige neu und einige entfernt)
quelle
Wenn Sie ab Django 1.2 RC1 den Widge-Trick für die Datumsauswahl von Django-Administratoren verwenden, muss Folgendes zu Ihrer Vorlage hinzugefügt werden. Andernfalls wird die URL des Kalendersymbols durch das Präfix "/ missing-admin-media-prefix" angezeigt / ".
quelle
Ergänzend zur Antwort von Carl Meyer möchte ich darauf hinweisen, dass Sie diesen Header in einen gültigen Block (innerhalb des Headers) in Ihrer Vorlage einfügen müssen.
quelle
Für Django> = 2,0
Schritt 1: Fügen
javascript-catalog
Sie derurls.py
Datei Ihres Projekts (nicht der App) eine URL hinzu .Schritt 2: Fügen Sie Ihrer Vorlage die erforderlichen JavaScript / CSS-Ressourcen hinzu.
Schritt 3: Verwenden Sie Admin-Widgets für Datums- und Uhrzeit-Eingabefelder in Ihrem
forms.py
.quelle
Das Folgende funktioniert auch als letzter Ausweg, wenn das Obige fehlgeschlagen ist
Gleich wie
Tragen Sie dies in Ihre forms.py ein
from django.forms.extras.widgets import SelectDateWidget
quelle
Wie wäre es, wenn Sie Ihrem Widget nur eine Klasse zuweisen und diese Klasse dann an den JQuery-Datepicker binden?
Django forms.py:
Und etwas JavaScript für die Vorlage:
quelle
Aktualisierte Lösung und Problemumgehung für SplitDateTime mit erforderlich = Falsch :
forms.py
form.html
urls.py
quelle
Ich benutze dies, es ist großartig, aber ich habe 2 Probleme mit der Vorlage:
Und für TimeField habe ich ' Geben Sie ein gültiges Datum ein. '
models.py
forms.py
quelle
In Django 10. myproject / urls.py: am Anfang von URL-Mustern
In meiner template.html:
quelle
Mein Django-Setup: 1.11 Bootstrap: 3.3.7
Da keine der Antworten vollständig klar ist, teile ich meinen Vorlagencode, der überhaupt keine Fehler enthält.
Obere Hälfte der Vorlage:
Untere Hälfte:
quelle
3. Juni 2020 (Alle Antworten haben nicht funktioniert. Sie können diese von mir verwendete Lösung ausprobieren. Nur für TimeField.)
Verwenden Sie in Formularen einfach
Charfield
für Zeitfelder ( in diesem Beispiel Start und Ende ).forms.py
wir können
Form
oderModelForm
hier verwenden.Konvertieren Sie die Eingabe von Zeichenfolgen in Ansichten in ein Zeitobjekt.
quelle