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 ;-)