2016-05-24 3 views
0

В основном я хочу расширить User, с некоторыми дополнительными данными. Все хорошее в модели, как предполагается в документации.DJango 1.9 Профиль регистрации + обновление

models.py

class perfil(models.Model): 
Sexos = (
     ('M','Masculino'), 
     ('F','Femenino'), 
     ) 

user = models.OneToOneField(User, related_name='profile') 
ci = models.CharField(max_length = 10, blank=True, null=True) 
sexo = models.CharField(max_length = 1, choices = Sexos, blank=True, null=True) 
fechaNac = models.DateField(blank=True, null=True) 
foto = models.CharField(max_length = 300,blank=True, null=True) 
tlf = models.CharField(max_length = 11,blank=True, null=True) 

def __str__(self): 
    return self.user.first_name + " " + self.user.last_name 

def __unicode__(self): 
    return self.user 

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

views.py

def registroUsuario(request): 
if request.user.is_authenticated(): 
    return HttpResponseRedirect('/registro') 
if request.method == "POST": 
    form = formRegistroUsuario(request.POST) 
    if form.is_valid(): 
     username = form.cleaned_data['username'] 
     nombre = form.cleaned_data['nombre'] 
     apellidos = form.cleaned_data['apellidos'] 
     f_nac = form.cleaned_data['f_nac'] 
     correo = form.cleaned_data['correo'] 
     tlf = form.cleaned_data['tlf'] 
     clave = form.cleaned_data['clave'] 
     sexo = form.cleaned_data['sexo'] 
     ci = form.cleaned_data['ci'] 
     entry = User.objects.create_user(username= username ,email = correo, password = clave) 
     entry.first_name = nombre 
     entry.last_name = apellidos 
     entry.save() 
     p_entry = perfil.objects.get(user = entry) 
     p_entry.ci = ci 
     p_entry.sexo = sexo 
     p_entry.fechaNac = f_nac 
     p_entry.tlf = tlf 
     p_entry.save() 
     return HttpResponseRedirect('/registro') 
    else: 
     return render(request,'registro/home.html', {'form': form}) 
    pass 
else: 
    form = formRegistroUsuario() 
    return render(request,'registro/home.html', {'form': form}) 

Но я думаю, что я не делаю этого строгого пути из того, что я видел, но я не могу понять, как заставить его работать по-другому.

Также мне нужно, чтобы иметь возможность обновить свой профиль, так что я сделал эти 2

class userForm(forms.ModelForm): 
username = forms.CharField(disabled = True, label = 'Nombre de usuario') 
first_name = forms.CharField(disabled = True, label = 'Nombre') 
last_name = forms.CharField(disabled = True, label = 'Apellido') 
password = forms.CharField(widget=forms.PasswordInput(), label = 'Contrasena', required = False) 
class Meta: 
    model = User 
    fields = ['first_name', 'last_name', 'username', 'password'] 

class perfilForm(forms.ModelForm): 
fechaNac = forms.DateField(disabled = True, label = 'Fecha de nacimiento') 
tlf = forms.CharField(label = 'Numero de telefono') 
ci = forms.CharField(disabled = True, label = 'CI') 
correo = forms.CharField(disabled = True) 
class Meta: 
    model = perfil 
    exclude = ('user',) 

И views.py

@login_required(login_url='/registro/login/') 
def editarUsuario(request): 
if request.method == "POST": 
    userform = userForm(instance = request.user, data = request.POST) 
    profileform = perfilForm(instance = request.user.perfil, data = request.POST) 
    if userform.is_valid() and profileform.is_valid(): 
     user = userform.save(commit = False) 
     user.user = request.user 
     if userform.cleaned_data['password']: 
      user.set_password(userform.cleaned_data['password']) 
     user.save() 
     profile = profileform.save(commit = False) 
     profile.user = user 
     profile.save() 
     return HttpResponseRedirect('/registro/editar') 
    else: 
     return render(request,'registro/editar.html', {'formUser': userform, 
                 'formPerfil': profileform}) 
else : 
    formUser = userForm(instance = request.user) 
    formPerfil = perfilForm(instance = request.user.perfil) 
    return render(request,'registro/editar.html', {'formUser': formUser, 
                'formPerfil': formPerfil}) 

Хотелось бы знать, как я мог бы улучшить свой код, чтобы сделать это путь Django. Кроме того, бит offtopic, я хотел бы показать те отключенные = True поля в userForm как метки, а не поля с readonly, как я мог это достичь?

ответ

0

Вы можете создать User и экземпляр UserProfile в то же время, что и в своем коде выше, но если вы не собираетесь использовать атомные транзакции, это может вызвать проблемы, если пользователь создан правильно, но в профиле есть ошибка. Вы можете обойти это, поместив все поля профиля пользователя в один пользовательский класс (как я объясню ниже), или вы можете позволить пользователям заполнить свой профиль на отдельной странице после регистрации.


Чтобы сделать свой собственный User класс:

Вы можете продлить заменить класс по умолчанию User с собственным классом (назовем его MyUser, предпочтительно подклассами либо AbstractUser или AbstractBaseUser то Вы можете обратиться к новому. класс в ваших настройках, как AUTH_USER_MODEL = 'models.MyUser', а в ваших внешних ключах - settings.AUTH_USER_MODEL (не забудьте использовать from django.conf import settings).

Подробнее о subjec т от Джанго Docs, которые объясняют это очень хорошо:

https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#specifying-a-custom-user-model

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