2016-05-24 3 views
0

基本的に私はいくつかの追加データでユーザーを拡張したいと考えています。 モデルに優れたものはすべて、ドキュメンテーションに従っています。一方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}) 

ものは私が作るために自分のコードを向上させることができるか知りたい作らそれはジャンゴの方法です。 また、ビットofftopic、私はそれらのdisabled = Trueフィールドをラベルとして表示する代わりに、読み取り専用のフィールドの代わりに、私はそれを達成することができますか?

答えて

0

上記のコードのように、UserUserProfileのインスタンスを同時に作成することはできますが、アトミックトランザクションを使用する場合を除き、ユーザーが正しく作成されると問題が発生する可能性がありますプロファイルにエラーがあります。これを回避するには、すべてのユーザープロファイルフィールドを1つのカスタムクラスに入れます(以下で説明します)。または、ユーザーが登録後に別のページにプロファイルを記入できるようにします。


独自のUserクラスにするには:あなたがあなた自身のクラスにデフォルトUserクラスを置き換える拡張することができます

を(好ましくはAbstractUserまたはAbstractBaseUserのどちらかをサブクラス化する、のはMyUserそれを呼びましょうあなたは、新しいを参照することができます。クラスをAUTH_USER_MODEL = 'models.MyUser'、外部キーをsettings.AUTH_USER_MODELfrom django.conf import settingsを忘れずに入力してください)。

ここでは、本当によくそれを説明するDjangoのドキュメントからT:

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

関連する問題