2013-11-24 4 views
0

У меня есть следующие формы, определенные в Django, и я не знаю, почему я не могу получить доступ к атрибуту «Имя пользователя» внутри метода «сохранить»:Джанго доступ к атрибутам с самим

class ExtendedUserForm(Form): 

    required_css_class = 'required' 

    username = forms.RegexField(regex=r'^[\[email protected]+-]+$', ...) 

    def save(self, commit = False): 

     User.objects.create_user(username = self.username, 
            email = self.email, 
            password = self.password1) 

... всякий раз, когда я пытаюсь получить доступ к нему, я получаю следующее исключение:

Exception Type: AttributeError 
Exception Value: 'ExtendedUserForm' object has no attribute 'username' 

Я новичок в Python, и я не в полной мере понять классы Python, несмотря прочитав официальный учебник. Любая помощь будет оценена.

+0

Этот пример сбивает с толку. 'save()' - это метод, используемый с 'ModelForm'. В регулярном классе 'Form' нет метода' save() '. –

+0

Мне не нужен ModelForm, для меня достаточно простой формы, поскольку, если я использую ModelForm (я уже пробовал этот путь) с помощью модели User из django.contrib.auth, я получаю много полей из этой модели, которые Я не хочу показывать в форме для регистрации пользователем. Поэтому я решил использовать более простую форму и самостоятельно создать метод «save». – Ricardo

+0

@LudwikTrammer, вы знаете, могу ли я использовать ModelForm и связывать его с моделью, чтобы я мог выбрать только набор полей, которые будут отображаться в полученной форме? Это может мне очень помочь, так как модель User из contrib.auth имеет много полей, которые мне не нужно показывать в форме для регистрации пользователей. – Ricardo

ответ

2

Данные очищенной формы доступны под номером self.cleaned_data. Учитывая username, email и password1 являются ExtendedUserForm «ы полей, вы можете написать save так:

def save(self, commit = False): 
    User.objects.create_user(username = self.cleaned_data['username'], 
           email = self.cleaned_data['email'], 
           password = self.cleaned_data['password1']) 

    return super(ExtendedUserForm, self).save(self, commit = commit) 
+0

Okey, я могу раскрыть, что Django сохраняет эти атрибуты в этом словаре; однако, если «я» является экземпляром класса, и этот класс имеет атрибут «имя пользователя», почему я не могу получить доступ к этим атрибутам в соответствии с выходом интерпретатора Python? – Ricardo

+2

@ Рикардо, это потому, что работает 'DeclarativeFieldsMetaclass'. Он выполняет итерации по атрибутам, собирая поля и манипулируя ими. После повторного использования поле удаляется из атрибутов класса ([источник] (https://github.com/django/django/blob/master/django/forms/forms.py#L77)). –

Смежные вопросы