Django Form - Set Label

74

Ich habe ein Formular, das von 2 anderen Formularen erbt. In meinem Formular möchte ich die Bezeichnung eines Felds ändern, das in einem der übergeordneten Formulare definiert wurde. Weiß jemand, wie das gemacht werden kann?

Ich versuche es in meinem zu tun __init__, aber es wird ein Fehler ausgegeben, der besagt, dass das Objekt '' RegistrationFormTOS '' kein Attribut 'email' hat. Weiß jemand, wie ich das machen kann?

Vielen Dank.

Hier ist mein Formularcode:

from django import forms
from django.utils.translation import ugettext_lazy as _
from registration.forms import RegistrationFormUniqueEmail
from registration.forms import RegistrationFormTermsOfService

attrs_dict = { 'class': 'required' }

class RegistrationFormTOS(RegistrationFormUniqueEmail, RegistrationFormTermsOfService):
    """
    Subclass of ``RegistrationForm`` which adds a required checkbox
    for agreeing to a site's Terms of Service.

    """
    email2 = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=75)), label=_(u'verify email address'))

    def __init__(self, *args, **kwargs):
        self.email.label = "New Email Label"
        super(RegistrationFormTOS, self).__init__(*args, **kwargs)

    def clean_email2(self):
        """
        Verifiy that the values entered into the two email fields
        match. 
        """
        if 'email' in self.cleaned_data and 'email2' in self.cleaned_data:
            if self.cleaned_data['email'] != self.cleaned_data['email2']:
                raise forms.ValidationError(_(u'You must type the same email each time'))
        return self.cleaned_data
TehOne
quelle

Antworten:

143

Du solltest benutzen:

def __init__(self, *args, **kwargs):
    super(RegistrationFormTOS, self).__init__(*args, **kwargs)
    self.fields['email'].label = "New Email Label"

Beachten Sie zuerst, dass Sie den Superanruf verwenden sollten.

Xbito
quelle
49

Hier ist ein Beispiel aus dem Überschreiben der Standardfelder :

from django.utils.translation import ugettext_lazy as _

class AuthorForm(ModelForm):
    class Meta:
        model = Author
        fields = ('name', 'title', 'birth_date')
        labels = {
            'name': _('Writer'),
        }
        help_texts = {
            'name': _('Some useful help text.'),
        }
        error_messages = {
            'name': {
                'max_length': _("This writer's name is too long."),
            },
        }
Marcelo Cintra de Melo
quelle
wie man es in der Django-Vorlage verwendet
user2413621
12

Sie können labelein Feldattribut festlegen, wenn Sie ein Formular definieren.

class GiftCardForm(forms.ModelForm):
    card_name = forms.CharField(max_length=100, label="Cardholder Name")
    card_number = forms.CharField(max_length=50, label="Card Number")
    card_code = forms.CharField(max_length=20, label="Security Code")
    card_expirate_time = forms.CharField(max_length=100, label="Expiration (MM/YYYY)")

    class Meta:
        model = models.GiftCard
        exclude = ('price', )
kiennt
quelle
2
Das Problem bei dieser Antwort ist, dass sie nicht erklärt, wie man sich ändert the label of a field that was defined in one of the parent forms- das übergeordnete Formular ist das wichtige Bit.
Jamesc
Es hat bei mir nicht funktioniert ...__init__() got an unexpected keyword argument 'label'
User
9

Sie greifen auf Felder in einem Formular über das Diktat "Felder" zu:

self.fields['email'].label = "New Email Label"

So müssen Sie sich keine Sorgen machen, dass Formularfelder Namenskonflikte mit den Formularklassenmethoden aufweisen. (Andernfalls könnten Sie kein Feld mit dem Namen 'clean' oder 'is_valid' haben.) Das Definieren der Felder direkt im Klassenkörper ist meist nur eine Annehmlichkeit.

Matthew Marshall
quelle
2

Es funktioniert nicht für die Modellvererbung, aber Sie können die Beschriftung direkt im Modell festlegen

email = models.EmailField("E-Mail Address")
email_confirmation = models.EmailField("Please repeat")
Bender-51
quelle