4 Stimmen

Django - Kann empty_label nicht aus TypedChoiceField entfernen

Ich habe ein Feld in meinem Modell:

TYPES_CHOICES = (
    (0, _(u'Worker')),
    (1, _(u'Owner')),
)
worker_type = models.PositiveSmallIntegerField(max_length=2, choices=TYPES_CHOICES)

Wenn ich es in ModelForm verwende, hat es den leeren Wert "---------". Da es sich um ein TypedChoiceField handelt, hat es kein empty_label-Attribut, so dass ich es im Formular nicht überschreiben kann. init Methode.

Gibt es eine Möglichkeit, diese "---------" zu entfernen?

Auch diese Methode funktioniert nicht:

def __init__(self, *args, **kwargs):
        super(JobOpinionForm, self).__init__(*args, **kwargs)
        if self.fields['worker_type'].choices[0][0] == '':
            del self.fields['worker_type'].choices[0]

EDIT:

Ich habe es geschafft, dass es auf diese Weise funktioniert:

def __init__(self, *args, **kwargs):
    super(JobOpinionForm, self).__init__(*args, **kwargs)
    if self.fields['worker_type'].choices[0][0] == '':
        worker_choices = self.fields['worker_type'].choices
        del worker_choices[0]
        self.fields['worker_type'].choices = worker_choices

5voto

Ben Davis Punkte 11835

Die leere Option für jedes Modellfeld mit Auswahlmöglichkeiten, die in der .formfield() Methode der Modellfeldklasse. Wenn Sie sich den Django-Quellcode für diese Methode ansehen, sieht die Zeile wie folgt aus:

include_blank = self.blank or not (self.has_default() or 'initial' in kwargs)

Der sauberste Weg, die leere Option zu vermeiden, ist also, eine Voreinstellung für das Feld Ihres Modells festzulegen:

worker_type = models.PositiveSmallIntegerField(max_length=2, choices=TYPES_CHOICES, 
                                               default=TYPES_CHOICES[0][0])

Andernfalls bleibt Ihnen nur das manuelle Hacken der .choices Attribut des Formularfeldes in der Formular __init__ Methode.

4voto

Mithril Punkte 11476

self.fields['xxx'].empty_value = None würde nicht funktionieren, wenn Sie den Feldtyp TypedChoiceField die nicht über empty_label Eigentum. Was wir tun sollten, ist, die erste Wahl zu entfernen:

class JobOpinionForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(JobOpinionForm, self).__init__(*args, **kwargs)

        for field_name in self.fields:
            field = self.fields.get(field_name)
            if field and isinstance(field , forms.TypedChoiceField):
                field.choices = field.choices[1:]

-2voto

Brandon Taylor Punkte 31967

Versuchen Sie es:

def __init__(self, *args, **kwargs):
    super(JobOpinionForm, self).__init__(*args, **kwargs)
    self.fields['worker_type'].empty_value = None

https://docs.djangoproject.com/en/1.3/ref/forms/fields/#typedchoicefield

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X