基本上我想用一些额外的数据来扩展User。 模型中的所有好东西都与文档一样。
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,我想在userForm上显示那些disabled = True字段作为标签,而不是readonly字段,我怎么能实现呢?
答案 0 :(得分:0)
你可以在上面的代码中同时创建User
和UserProfile
实例,但除非你打算使用原子事务,否则它可能会导致问题用户已正确创建,但配置文件有错误。您可以通过将所有用户配置文件字段放在一个自定义类中来解决这个问题(我将在下面解释),或者您可以让用户在注册后在单独的页面上填写他们的个人资料。
制作自己的User
课程:
您可以使用自己的类扩展替换默认的User
类(我们称之为MyUser
,最好是AbstractUser
或AbstractBaseUser
的子类。然后您可以参考新的在您的设置中将该类设为AUTH_USER_MODEL = 'models.MyUser'
,将外键设为settings.AUTH_USER_MODEL
(请记住使用from django.conf import settings
)。
以下是Django Docs关于这个主题的更多信息,它解释得非常好:
https://docs.djangoproject.com/en/1.9/topics/auth/customizing/#specifying-a-custom-user-model