Seite 1 von 1
ein newforms feld in 2 input tags aufteilen?
Verfasst: Sonntag 22. Juni 2008, 09:22
von d3f3nd3r
hallo,
und wieder einmal brauche ich euren Rat.
Ist es mit django.newforms möglich ein Feld eines forms als 2 <input> Tags in html darzustellen und die Eingabedaten wieder zusammenzuführen?
Also ungefähr so :
Eine Form Klasse die Datum und Zeitpunkt entgegen nimmt:
Code: Alles auswählen
class DateTimeExample(forms.Form):
finished_at = forms.DateTimeField()
und dann wäre ein html Formular nett, bei dem Datum und Zeit getrennt sind.
Natürlich könnte ich auch ein DateField und ein TimeField benutzen und diese dann zusammenfügen.
Mein Hintergedanke ist aber, folgender : das Forumlar sollte aber aus einem Datenbanke model erzeugt werden und dann einfach gespeichert werden und in diesem model wird eben ein DateTimeField benutzt....
also so sollte dann der Speichervorgang aussehen :
Code: Alles auswählen
project_form = ProjectForm(request.POST,instance = Project.all.get(id=object_id))
if project_form.is_valid():
project = project_form.save(commit=False)
project.save()
mfg
Verfasst: Sonntag 22. Juni 2008, 19:41
von jens
IMHO gibt es da zwei Wege. Entweder du packst deine Sachen in die form rein (also eigenes widget und validator) oder du packst die Logik in deine POST Auswertung, benutzt also zwei normale form Felder.
Spontan würde ich sagen das die erste Variante seinen Reiz hat, aber schwieriger ist.
Verfasst: Montag 23. Juni 2008, 10:54
von d3f3nd3r
alles in ein form reinpacken, damit meinst du ein eigenes Feld machen ?
hab da gerade wenig durchblick...
Verfasst: Montag 23. Juni 2008, 23:41
von Leonidas
Nein, Jens zeigt zwei Möglichkeiten auf. Entweder zwei einzelne Felder machen oder eigene, neue Felder erstellen. Letztere Möglichkeit ist sicherlich eleganter und wohl auch angeraten - ist nur die Frage wie sehr du dich da einarbeiten willst.
Verfasst: Dienstag 24. Juni 2008, 12:29
von d3f3nd3r
ja im großen und ganzen fehlt mir jetzt einmal der einsprungspunkt!
die django dokumentation ist beim thema "erstellen eigener felder" nicht recht aussagekräftig (für mich zumindest) :
If the built-in Field classes don’t meet your needs, you can easily create custom Field classes. To do this, just create a subclass of django.newforms.Field. Its only requirements are that it implement a clean() method and that its __init__() method accept the core arguments mentioned above (required, label, initial, widget, help_text).
Kennt ihr lehrreiche Beispiele (die von django mitgelieferten fields sind da ein bisschen kompliziert)?
vll kann ich jetzt mein Problem etwas genauer umreißen :
i*ch muss ein eigenes Field erstellen
*in diesem muss ich dann zb 2 Werte (request.POST['datum'] und request.POST['zeit']) zusammenführen und als DateTime Value zurückgeben
leider hab ich keine Ahnung wie ich das realsieren könnte...
Kennt jemand Tipps / Beispiele / Dokumentation?
mfg
Verfasst: Mittwoch 25. Juni 2008, 17:08
von d3f3nd3r
Ich glaube ich hab eine möglich Lösung gefunden!
django.newforms bietet folgende Klasse : MultiValueField
damit müsste ich mehrere Felder kombinieren können. Leider ist die zu dieser Klasse noch keine Doku vorhanden.....
Hat jemand damit Erfahrung?
mfg
Verfasst: Mittwoch 25. Juni 2008, 19:13
von jens
Tiefergehende Dokumentation zu newforms ist generell noch nicht vorhanden. Es lohnt sich allerdings in die newforms Tests und die newforms sourcecode zu schauen. Außerdem probieren, probieren, probieren...
Aber evtl. findest du auch ein "erklärendes" code Stückchen auf den Mailinglisten oder bei
http://www.djangosnippets.org
Kannst du beides per google durchsuchen
Verfasst: Mittwoch 25. Juni 2008, 22:43
von Leonidas
jens hat geschrieben:Es lohnt sich allerdings in die newforms Tests und die newforms sourcecode zu schauen.
Oder in #django.
Verfasst: Donnerstag 26. Juni 2008, 08:34
von d3f3nd3r
jup hab gerade jemanden auf der malinglist kontaktiert, der anscheinend das selbe Problem hatte.
Verfasst: Dienstag 1. Juli 2008, 19:12
von d3f3nd3r
so hab jetzt die Lösung gefunden und werd sie hier posten, vll hilft es ja jemandem
Code: Alles auswählen
import django.newforms as forms
class DateTimeCombiWidget(forms.MultiWidget):
""" A newform widget, which provides seperate input tags for date and time, the output
is merged again """
def __init__(self, attrs=None):
widgets = (forms.TextInput(),forms.TextInput())
super(DateTimeCombiWidget, self).__init__(widgets, attrs)
def decompress(self, value):
if value:
return value.split(' ', 2)
return ['', '']
class DateTimeCombiField(forms.MultiValueField):
""" A newform field, which provides seperate input tags for date and time, the output
is merged again """
def __init__(self, required=True, label=None, widget=None,initial=None):
fields = (forms.DateField(),forms.TimeField())
widget = widget or DateTimeCombiWidget()
super(DateTimeCombiField, self).__init__(fields, required,widget, label, initial)
def compress(self, data_list):
if data_list:
return " ".join(str(i) for i in data_list)
return None
benutzt wird das dann ganz normal wie folgt :
Code: Alles auswählen
from django.newforms import ModelForm
from fields import DateTimeCombiField
from models import Event
class EventForm(ModelForm):
startDate = DateTimeCombiField()
endDate = DateTimeCombiField(required=False)
class Meta:
model = Event
exclude = ('where','startDate','endDate'','who')
Verfasst: Dienstag 1. Juli 2008, 19:47
von jens
Sehr schön. Wäre allerdings nicht schlecht, wenn du die Quelle nennen würdest
Verfasst: Sonntag 6. Juli 2008, 09:00
von d3f3nd3r
http://groups.google.com/group/django-u ... f1f5038755
hab mir da halt angesehen wie MulitValueField funktioniert