Machen Django Formen.DateField-Karte verwenden lokale Datum-format
Ich versuche zu finden, eine einfache Möglichkeit zum erstellen von Formularen, die show-Termine in der australischen format (TT/mm/JJJJ). Dies war die einzige Möglichkeit, die ich finden konnte, es zu tun. Es scheint, wie es sollte eine bessere Lösung sein.
Dinge zu beachten:
- Erstellt ein neues widget rendert Datum dd/mm/yyyy format
- Erstellt neue date-Feld vorangestellt wird, die suchen Datumsformat-Zeichenfolge, um die Liste der Werte, die Sie versucht, zu verwenden
Stelle ich mir die ideale Lösung wäre eine datefield, die automatisch lokalisiert, aber das funktionierte nicht für mich (strftime nicht zu sein scheinen, unicode-freundlich, aber ich didn ' T versuchen sehr hart)
Bin ich etwas fehlt? Gibt es eine elegantere Lösung? Ist das ein robustes Konzept?
from models import *
from django import forms
import datetime
class MyDateWidget(forms.TextInput):
def render(self, name, value, attrs=None):
if isinstance(value, datetime.date):
value=value.strftime("%d/%m/%Y")
return super(MyDateWidget, self).render(name, value, attrs)
class MyDateField(forms.DateField):
widget = MyDateWidget
def __init__(self, *args, **kwargs):
super(MyDateField, self).__init__(*args, **kwargs)
self.input_formats = ("%d/%m/%Y",)+(self.input_formats)
class ExampleForm(ModelForm):
class Meta:
model=MyModel
fields=('name', 'date_of_birth')
date_of_birth = MyDateField()
- Eine einfache alternative ist, sich an einem javascript-Kalender-widget zu tun, die Lokalisierung. Wir verwenden, versteckt sich einfach meine date-Feld und erstellt einen weiteren mit der lokalen Formatierung angegeben wurde.
- Alle Informationen über bestimmte widgets und schließt ein widget?
- Ich glaube, ich sollte siehe stackoverflow-Frage: stackoverflow.com/questions/114068/....
- Meine Antwort unten bietet einen viel allgemeineren Ansatz als irreguläres format für das widget.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zugegeben, ich bin kein django/python Jedi, aber...
Ich glaube nicht, dass es etwas falsch mit Ihrem Konzept. Es ist eine saubere Lesen.
Können Sie nicht brauchen, um erstellen Sie Ihr eigenes widget nur zum Rendern Sie das Datum im richtigen format, auf dem ersten Formular anzeigen. Verwenden Sie einfach die
format
parameter für dieDateInput
- widget, und Sie sollten OK sein. Also in deinem MyDateField-Klasse würde ich nur tun:Könnten Sie
formfield_callback
(Siehe akzeptierte Antwort für das entfernt Verwandte Frage), was bedeutet:Tun, die vollständig eliminiert die Notwendigkeit für Ihre
MyDateField
Klasse, aber könnte sich vorstellen - wenn Sie möchten, dass jede einzelne form-Klasse zu nennencustomize_fields
- die Notwendigkeit für eine ModelForm Nachkomme, Umsetzungformfield_callback=customize_fields
als die neue Basis für alle form-Klassen.Mein problem mit der
formfield_callback
Mechanismus ist zwei-Fach:Ist es weniger lesbar und setzt Sie in Kenntnis über das Innenleben der ModelForms. Ich kann nicht finden, eigentlichen Dokumentation auf formfield_callback überall...
Wenn Sie jemals brauchen, um neu zu definieren, ein Modell-Feld in eine ModelForm, sagen, dass das Feld nicht erforderlich für die jeweilige Instanz des Formulars, etwa so:
sind Sie überschreiben das Formularfeld zurückgegeben customize_fields, daher komplett zu verlieren, die Anpassung.
Ich denke, dein Ansatz ist mehr lesbar.
Ich verwendet habe, dieser einfache Ansatz vor: setzen Sie einfach die "format" - Attribut des DateField.widget in die init des Formulars:
Alle custom-widget-Kram umgangen werden können.
Hier ein Auszug aus
django/forms/widgets.py
:Werden Sie feststellen, dass das format des widgets wird mit Hilfe des format-Modul. Die format-Modul wird ausgewählt, je nach Gebietsschema. Wenn Sie gerade aus den USA, Django, standardmäßig, wählen Sie
django.conf.formats.locale.en.formats.py
. Hier finden Sie das Standard-format:Wie Sie sehen können in der ersten code-block, Django wählt den ersten dieser. Die sorgfältige Vorgehensweise zu ändern das format ist ein eigenes format zu erstellen-Modul, das Außerkraftsetzen von Django ist die Standardeinstellung für das Gebietsschema, in Frage. Für das, Aussehen in FORMAT_MODULE_PATH. Wenn alles, was Sie zu tun versuchen ist, überschreiben die Standard-Datum-format, ich sage sparen Sie sich die Zeit und monkey patch. Ich habe dies nur Hinzugefügt, um "meine Einstellungen" - Datei, und alles scheint zu funktionieren prächtig mit meiner bevorzugten Standard-format:
In der form I ' me mit: