2012-05-13 4 views
8

Я хочу создать SINGLE форма, которая дает возможность администратору создать нового пользователя с расширенным профилем. Обратите внимание, что я не хочу использовать приложения для администрирования и регистрации. Я расширил пользователя с помощью модели UserProfile. Я прочитал все документы, связанные с расширением профиля пользователя. Но я действительно не знаю, как сохранить эту информацию. я закодирован с помощью следующей формы Джанго этого вопроса:Создание Добавить форму пользователя в Django

class CreateUserForm(forms.Form): 
username = forms.CharField(max_length=30) 
first_name = forms.CharField() 
last_name = forms.CharField() 
password1=forms.CharField(max_length=30,widget=forms.PasswordInput()) #render_value=False 
password2=forms.CharField(max_length=30,widget=forms.PasswordInput()) 
email=forms.EmailField(required=False) 

title = forms.ChoiceField(choices=TITLE_CHOICES) 

def clean_username(self): # check if username dos not exist before 
    try: 
     User.objects.get(username=self.cleaned_data['username']) #get user from user model 
    except User.DoesNotExist : 
     return self.cleaned_data['username'] 

    raise forms.ValidationError("this user exist already") 


def clean(self): # check if password 1 and password2 match each other 
    if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:#check if both pass first validation 
     if self.cleaned_data['password1'] != self.cleaned_data['password2']: # check if they match each other 
      raise forms.ValidationError("passwords dont match each other") 

    return self.cleaned_data 


def save(self): # create new user 
    new_user=User.objects.create_user(username=self.cleaned_data['username'], 
            first_name=self.cleaned_data['first_name'], 
            last_name=self.cleaned_data['last_name'], 
            password=self.cleaned_data['password1'], 
            email=self.cleaned_data['email'], 
             ) 

    return new_user 

нормально ли это? однако он дает мне ошибку в first_name и last_name. Говорит, что django не ожидает first_name и last_name в методе save().

+0

Я не уверен, что у вас есть доступ к методу 'save' через обычную форму. Он доступен в образце для уверенности https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method – super9

ответ

13

create_user поддерживает только имя пользователя, адрес электронной почты и пароль. Сначала вызовите create_user, затем добавьте дополнительные значения к сохраненному объекту.

new_user=User.objects.create_user(self.cleaned_data['username'], 
            self.cleaned_data['email'], 
            self.cleaned_data['password1']) 
new_user.first_name = self.cleaned_data['first_name'] 
new_user.last_name = self.cleaned_data['last_name'] 
new_user.save() 
+0

Вы правы. Как насчет других полей профиля пользователя? Нужно ли сохранять их так же, как поля пользователя? BTW, я хочу убедиться, что я выбрал правильное решение для этого. Итак, правильно? –

+6

Если вы имеете в виду такие поля, как «компания» и «адрес», вы можете создать модель UserProfile, которая имеет отношения «один к одному» с пользователем (https://docs.djangoproject.com/en/dev/topics/auth/# авт-профили). Таким образом вы можете добавить столько полей, сколько хотите, и получить их с помощью user.get_profile(). Company –

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