В основном я хочу расширить 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, как я мог это достичь?