ein newforms feld in 2 input tags aufteilen?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Sonntag 22. Juni 2008, 09:22

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Sonntag 22. Juni 2008, 19:41

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.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Montag 23. Juni 2008, 10:54

alles in ein form reinpacken, damit meinst du ein eigenes Feld machen ?
hab da gerade wenig durchblick...
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 23. Juni 2008, 23:41

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Dienstag 24. Juni 2008, 12:29

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
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Mittwoch 25. Juni 2008, 17:08

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
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 25. Juni 2008, 19:13

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 25. Juni 2008, 22:43

jens hat geschrieben:Es lohnt sich allerdings in die newforms Tests und die newforms sourcecode zu schauen.
Oder in #django.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Donnerstag 26. Juni 2008, 08:34

jup hab gerade jemanden auf der malinglist kontaktiert, der anscheinend das selbe Problem hatte.
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Dienstag 1. Juli 2008, 19:12

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



Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 1. Juli 2008, 19:47

Sehr schön. Wäre allerdings nicht schlecht, wenn du die Quelle nennen würdest ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
d3f3nd3r
User
Beiträge: 40
Registriert: Montag 19. November 2007, 20:17

Sonntag 6. Juli 2008, 09:00

http://groups.google.com/group/django-u ... f1f5038755

hab mir da halt angesehen wie MulitValueField funktioniert ;-)
Antworten