2017-06-12 23 views
0

Djangoユーザーモデルを拡張して独自のフィールドを追加しました。登録中にこれらのフィールドを入力する作業を現在行っています。フォームは、保存以外のすべてを使って正しく動作しているようです。フォームを保存中にDjango Integrityエラーが発生しました

私は助けにthisを使用しました。ここで

は、ユーザモデルの拡張である:ここで

class StudentProfile(models.Model): 
    user = models.OneToOneField(User, null = True, related_name='user', on_delete=models.CASCADE) 
    teacher = models.BooleanField(default = False) 
    school = models.CharField(max_length = 50) 

def create_StudentProfile(sender, **kwargs): 
    if kwargs['created']: 
     user_profile = StudentProfile.objects.create(user = kwargs['instance']) 


post_save.connect(create_StudentProfile, sender = User) 

は私の様式である:ここでは

class StudentRegistrationForm(UserCreationForm): 
    email = forms.EmailField(required = True) 
    school = forms.CharField(required = True) 

    def __init__(self, *args, **kwargs): 
     super(StudentRegistrationForm, self).__init__(*args, **kwargs) 
     self.fields['username'].help_text = '' 
     self.fields['password2'].help_text = '' 


    class Meta: 
     model = User 

     fields = (
      'username', 
      'first_name', 
      'last_name', 
      'email', 
      'school', 
      'password1', 
      'password2'    
     ) 

    def save(self, commit = True): 
     user = super(StudentRegistrationForm, self).save(commit = False) 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 
     user.email = self.cleaned_data['email'] 


     student_profile = StudentProfile(user = user, school = self.cleaned_data['school']) 

     if commit: 
      user.save() 
      student_profile.save() 

     return user, student_profile 

は、私の見解である。ここでは

def registration(request): 
    if request.method == 'POST': 
     form = StudentRegistrationForm(request.POST) 
     if form.is_valid(): 
      user, user_profile = form.save(commit = False) 
      form.save() 
      return render(request, 'accounts/home.html') 
     else: 
      args = {'form': form} 
      return render(request, 'accounts/reg_form.html', args) 

    else: 
     form = StudentRegistrationForm() 

     args = {'form': form} 
     return render(request, 'accounts/reg_form.html', args) 

は私のトレースバックです:

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" in execute 
    64.     return self.cursor.execute(sql, params) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py" in execute 
    337.   return Database.Cursor.execute(self, query, params) 

The above exception (NOT NULL constraint failed: userprofile_studentprofile.user_id) was the direct cause of the following exception: 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 
    39.    response = get_response(request) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "/Users/wtreston/GDrive/LesRev/lesssonreview/userprofile/views.py" in registration 
    13.    form.save() 

File "/Users/wtreston/GDrive/LesRev/lesssonreview/userprofile/forms.py" in save 
    41.    student_profile.save() 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" in save 
    796.      force_update=force_update, update_fields=update_fields) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" in save_base 
    824.    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" in _save_table 
    908.    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py" in _do_insert 
    947.        using=using, raw=raw) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method 
    85.     return getattr(self.get_queryset(), name)(*args, **kwargs) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/query.py" in _insert 
    1045.   return query.get_compiler(using=using).execute_sql(return_id) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/sql/compiler.py" in execute_sql 
    1054.     cursor.execute(sql, params) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" in execute 
    79.    return super(CursorDebugWrapper, self).execute(sql, params) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" in execute 
    64.     return self.cursor.execute(sql, params) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/utils.py" in __exit__ 
    94.     six.reraise(dj_exc_type, dj_exc_value, traceback) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/utils/six.py" in reraise 
    685.    raise value.with_traceback(tb) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/utils.py" in execute 
    64.     return self.cursor.execute(sql, params) 

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py" in execute 
    337.   return Database.Cursor.execute(self, query, params) 

Exception Type: IntegrityError at /users/ 
Exception Value: NOT NULL constraint failed: userprofile_studentprofile.user_id 

ありがとうございます!

答えて

1

Userモデルを使用してユーザーを作成する必要があります。onetooneフィールドがStudentProfileになるので、StudentProfileにこのユーザーを渡す必要があります。

def save(self, request): 
     form = StudentRegistrationForm(request.POST) 
     user = User.objects.create(first_name=form.cleaned_data['first_name'], 
          last_name=form.cleaned_data['last_name'], 
          email=form.cleaned_data['email'], 
          username=form.cleaned_data['username']) 
     user_profile = StudentProfile.objects.create(user=user, 
               teacher=form.cleaned_data['teacher'], 
               school=form.cleaned_data['school']) 


     return user, student_profile 
+0

あなたの方法を試みている間、私は「1つの必要な位置引数行方不明)(保存: 『要求』を」というエラーを取得するライン「ユーザー、USER_PROFILE = form.save()」 – wtreston

+0

使用 'ユーザーで私の見解で、user_profile = form.save(request) ' –

+0

これを動作させました。それをself.cleaned_dataに変更し、うまくいった! – wtreston

0

使用オブジェクトが保存されていないように見えるため、参照StudentProfileモデルを保存できます。

0

ここにはいくつかの問題があります。

直面する問題は、UserProfileを2か所に作成していることです。ユーザが作成されたときに自動的にシグナルハンドラを作成するシグナルハンドラ(create_StudentProfile)を登録しました。フォームのsaveメソッドで新しいものを作成しています。

シグナルハンドラが本当に必要かどうかを検討する必要があります。このフォームを使用してユーザーを作成する場合は、そのハンドラーは不要です。

信号が必要と判断した場合は、保存方法をやり直して考慮する必要があります。ような何か:

def save(self, commit=True): 
    user = super(StudentRegistrationForm, self).save(commit = False) 
    if commit: 
     user.save() 
     profile = user.userprofile 
    else: 
     profile = UserProfile(user=user) 

    profile.school = self.cleaned_data['school'] 

    if commit: 
     profile.save() 

    return user, student_profile 

あなたはこれらはすでにスーパーコールのフォームで行われますよう、電子メールと名前を設定する必要はありませんのでご注意ます。

2番目の問題は、ビューでsaveメソッドを2回呼び出すことです。それをしないでください。

if form.is_valid(): 
     user, user_profile = form.save() 
     return render(request, 'accounts/home.html') 
+0

私はシグナルハンドラを削除し、私のビューでコードを変更しました。しかし、私はまだ同じエラーが発生しています: "IntegrityError at/users/ NOT NULL制約に失敗しました:userprofile_studentprofile.user_id"。ユーザーは作成されてデータベースに追加されますが、学校などの追加されたフィールドは保存されません。 – wtreston

+0

あなたはそれらの両方のことをするべきではありません、彼らは選択肢でした。まだどこかにプロファイルを作成する必要があります。 –

+0

私は混乱しています...申し訳ありません。あなたが書いたことから私が理解しているように、シグナルハンドラは、StudentProfileと、Forms saveメソッドの1つを作成しました。私はこのフォームを通してユーザーを追加するだけなので、シグナルハンドラを削除し、保存メソッドをそのまま残しました。私は私のビューでsaveメソッドを更新しました。私はあなたが何を意味するのか理解していません。ありがとう – wtreston

関連する問題