Django Formular-Initialwerte werden nicht gesetzt

Django, Flask, Bottle, WSGI, CGI…
Antworten
ratondeau
User
Beiträge: 1
Registriert: Dienstag 26. Februar 2013, 09:25

Hallo zusammen,

ich habe ein Formular, das zum Bearbeiten von verschiedenen Werten dienen soll. Da die Daten anders präsentiert werden sollen, als sie in der Datenbank geschrieben werden habe ich ein eigenes Formularfeld creiert.

Das Feld besteht aus einem Integer-Feld und einem Dezimal-Feld

Code: Alles auswählen

class OddsField(MultiValueField):
    widget = OddsWidget()

    def __init__(self, *args, **kwargs):
        number = IntegerField()
        amount = DecimalField(decimal_places = 2)
        fields = [number, amount]
        super(OddsField, self).__init__(fields, *args, **kwargs)
Die Werte aus der Datenbank sehen etwa so aus: "5x120340.34" die 5 soll nun als Initialwert in das Integer-Feld der Rest in das Decimal. Das soll aber nur passieren, wenn auch Werte gefunden werden, dazu der Aufruf:

Code: Alles auswählen

class DrawAdminForm(forms.ModelForm):

    class Meta:
        model = Draw
        exclude = ('figures','odds')

    def __init__(self, *args, **kwargs):
        draw = kwargs.pop('instance')
        super(DrawAdminForm, self).__init__(*args, **kwargs)
        values = draw.get_figures()
        odd_entries = draw.get_odds_numbers()
        self.odds = list()
        self.fields['date_time'].widget = widgets.AdminSplitDateTime()

        for index in range(draw.get_number_figures()):
            self.fields['dynf_%s' % index] = forms.IntegerField(label='Zahl' + str(index+1), initial=values[index])


        for index in range(draw.get_number_classes()):
            self.fields['class_%s' % index] = OddsField(label='Klasse ' + str(index+1)  , required=False)

            if len(odd_entries) > index :
                entries = str(odd_entries[index]).split(AMOUNT_SEPARATOR)
                self.fields['class_%s' % index].fields[0].initial = int(entries[0])
                self.fields['class_%s' % index].fields[1].initial = Decimal(entries[1])
Template

Code: Alles auswählen

                   {% for field in form %}
                        {% if field.name|starts_with:"class" %}
                        <label class="left" for="{{form.field.name}}">{{ field.label_tag }}: </label>
                            {{ field }} {{ draw.game.currency }} {{ field.errors }} <br/>
                        {% endif %}
                    {% endfor %}

Das Initialisieren klappt bei den Zahlen und dem normalen Integer-Feld, nur nicht mit dem eigenen...
Was mache ich falsch?

Vielen Dank
Matt
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

Ich verstehe nicht, warum du in der __init__ am Ende die Methode noch einmal aufrufst und so ja in einer Endlosschleife landest…
Klär mich auf, wenn ich das falsch sehe
LG Maik
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

daemonTutorials hat geschrieben:Ich verstehe nicht, warum du in der __init__ am Ende die Methode noch einmal aufrufst und so ja in einer Endlosschleife landest…
War das jetzt der Aprilscherz?

Ich sehe keinen rekursiven Aufruf. Wo soll der sein?
Benutzeravatar
daemonTutorials
User
Beiträge: 171
Registriert: Sonntag 6. Februar 2011, 12:06
Kontaktdaten:

/me hat geschrieben:
daemonTutorials hat geschrieben:Ich verstehe nicht, warum du in der __init__ am Ende die Methode noch einmal aufrufst und so ja in einer Endlosschleife landest…
War das jetzt der Aprilscherz?

Ich sehe keinen rekursiven Aufruf. Wo soll der sein?
Naja, passte ja ^^ Ich hab das super() überlesen -.-

Bei DrawAdminForm holst du dir die Elternklasse per django.forms.ModelForm. Das MultiValueField ist unter django.forms.MultiValueField zu erreichen.

Ist dein OddsWidget auch richtig abgeleitet (https://docs.djangoproject.com/en/1.5/r ... eld.widget)

Mehr fällt mir auf die Stelle nicht ein.
LG Maik
Antworten