2017-07-14 8 views
1

djangoから簡単なサインアップ/ログインページを作成しようとしています。 私はUserCreationFormを使用し、モデルUserProfileを使用してユーザーモデルを拡張しました。 申し込みの投稿リクエストを保存しようとしたときに、整合性エラーが発生しています。 私はdjangoに新しいので、簡単な説明をいただければ幸いです。事前に おかげIntegrityError:NOT NULL制約に失敗しました:core_userprofile.user_id

forms.py

from django import forms 
from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.models import User 
from mysite.core.models import UserProfile 
from django.db import models 

class SignUpForm(UserCreationForm): 
    first_name = forms.CharField(max_length=30, required=False, help_text='Optional.') 
    department = forms.CharField(max_length=30) 
    last_name = forms.CharField(max_length=30, required=False, help_text='Optional.') 
    email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.') 

    class Meta: 
     model = User 
     fields = ('username', 'first_name', 'last_name', 'email','password1', 'password2', 'department',) 

    def save(self, commit=True): 
     # Save the provided password in hashed format 
     user = super(SignUpForm, self).save(commit=False) 
     user_profile = UserProfile(user=user, department=self.cleaned_data['department']) 
     user.save() 
     user_profile.save() 
     return user, user_profile 

views.py

from django.contrib.auth.decorators import login_required 
from django.contrib.auth import login, authenticate 
from django.shortcuts import render, redirect 
from mysite.core.forms import SignUpForm 

@login_required 
def home(request): 
    return render(request, 'home.html') 

def signup(request): 
    if request.method == 'POST': 
     form = SignUpForm(request.POST) 
     if form.is_valid(): 
      user,user_profile = form.save(commit=False) 
      username = user.cleaned_data.get('username') 
      raw_password = user.cleaned_data.get('password1') 
      user = authenticate(username=username, password=raw_password) 
      login(request, user) 
      return redirect('home') 
    else: 
     form = SignUpForm() 
    return render(request, 'signup.html', {'form': form}) 

models.py

from django.db import models 
from django.contrib.auth.models import User 
class UserProfile(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE,unique=True) 
    department = models.CharField(max_length=500, blank=True) 

答えて

0

ユーザーに割り当てる前に、あなたはuserを保存する必要がありますプロフィール。フォームのsave()方法でuseruser_profileの作成

user = super(SignUpForm, self).save(commit=False) 
user.save() 
user_profile = UserProfile(user=user, department=self.cleaned_data['department']) 

は少し混乱しています。あなたのメソッドは、ユーザとユーザのプロファイルを常に保存するので、もはやcommitフラグを尊重しません。プロファイルを作成するコードをビュー内のブロックif form.is_valid()に移動する方が良いでしょう。 ユーザ名= user.cleaned_data.get( 'ユーザ名') はAttributeErrorサインアップで、 /views.py」、17行目:私はエラーを取得しています、そうすることによって

+0

は、 'ユーザー' オブジェクトには属性「cleaned_dataを持っていません' –

+0

これは別の問題です。フォームを使用して、 'form.cleaned_data [' username ']'のような、きれいなデータを取得する必要があります。 – Alasdair

+0

助けてくれてありがとう、最後に、このuser_profileデータをテンプレートでどのように取得できますか? 私はuser_profile.departmentで試していますが、それを取得することはできません。 –

関連する問題