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

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.


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."),
            },
        }

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

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.


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")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.