2017-11-02 5 views
0

競合することができるmodels.py以下models.pyやviews.pyは以下

from django.db import models 
from django.core.urlresolvers import reverse 
#from django.core.urlresolvers import reverse 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 

class Registration(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    username = models.CharField(max_length = 250) 
    password = models.CharField(max_length = 250) 
    email = models.CharField(max_length = 250) 

@receiver(post_save, sender=User) 
def update_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Registration.objects.create(username=instance) 
    instance.registration.save() 

の出力は、私は2つの質問があるviews.py

from django.shortcuts import render, redirect 
from django.contrib.auth import authenticate, login 
from django.contrib.auth.forms import UserCreationForm 
from .forms import SignUpForm 
from django.views import generic 

class IndexView(generic.View): 
    templet_name = 'user_info/index.html' 


def signupview(request): 
    if request.method == 'POST': 
     form = SignUpForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      username = form.cleaned_data.get('username') 
      raw_password = form.cleaned_data.get('password') 
      user = authenticate(username=username, password=raw_password) 
      login(request, user) 
      return redirect('registration_form.html') 

    else: 
     form = SignUpForm() 
    return render(request,'user_info/registration_form.html', {'form': form}) 

の出力であるされています。

1)私のmodels.pyには、 'user'、 'username'、 'password'、 'email'の4つのフィールドがあります。最初のフィールド "user"では、私が理解しているように、主キーと外部キーがあるときに使用されるため、 "models.OneToOneField(User、on_delete = models.CASCADE)働いている。私が間違っていれば私を修正してください。

2)私のviews.pyの関数 "signupview"では、form.save()でデータベースにフォームを保存してからデータを消去しています。私のmodels.pyは4つのフィールドを持っているように私は、正しいことを行っているが、view.pyに、私は2つのフィールドのみ

username = form.cleaned_data.get('username') 
raw_password = form.cleaned_data.get('password') 

私はここに意味を作っています希望を与えています。以下は

python manage.py createsupseruser 

を通じてスーパーユーザを作成すると、私はこれらの質問を求めています理由ですエラー

django.db.utils.IntegrityError: NOT NULL constraint failed: user_info_registration.user_id 

ている間、私はエラーを取得しています。

forms.py

from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 
from django import forms 
#from django.forms import ModelForm 

class SignUpForm(UserCreationForm): 
    #first_name = forms.CharField(max_length=30, required=False, help_text='Optional.') 
    #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','password1','email') 

models.pyの最新見た目:

from django.db import models 
from django.contrib.auth.models import User 

class Registration(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
+2

いいえ、あなたは理にかなっていません。なぜあなたはその登録モデルを持っていますか?これらのフィールドはすべてUser上にあります。別のモデルを使用する唯一の理由は、Userモデルにまだない追加の情報を保存する場合です。それ以外は、プレーンテキストでパスワードを保存しないでください。そのため、Userモデルにはパスワードを設定するメソッドがあります。登録を完全に削除するだけです。 –

+0

登録モデルを削除して、作成したユーザーを作成しようとすると、「django.db.utils.IntegrityError:UNIQUE制約が失敗しました:auth_user.username」エラー – user3521180

+0

SignupFormの定義はどこですか? –

答えて

1

あなたがエラーを取得する理由は、信号の保存UserポストはRegistrationインスタンスを作成しようとするということですが、あなたすべての必須フィールドに値を指定しないでください。

@receiver(post_save, sender=User) 
def update_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Registration.objects.create(username=instance) 
    instance.registration.save() 

次のいずれかが、このシグナルハンドラを削除する必要があります。または、Registration.objects.create()に有効な引数を提供する必要があります。

+0

PS:私はこのアプリは学習の練習だと思います。パスワードとユーザの詳細を扱う独自のコードを書く前に、djangoのドキュメントを注意深く読んで理解しておく必要があります。 djangoユーザー認証システムは、専門家によって書かれています。あなたがパスワードなどを処理する独自のコードを書く場合、あなたのアプリは非常に安全ではないという大きなリスクがあります。それは非常に高価な家のセキュリティシステムを購入し、誰かが見つけるためにキーと警報のパスワードをドアマンの下に置くようなものです。 –

+0

したがって、ユーザー認証を拡張しない限り正しく理解していれば、デフォルトの「ユーザー」モデルを上書きしないでください。私は何もカスタマイズしていないのでカスタマイズされた信号は必要ありません。私が間違っている場合は、私は、デフォルトの設定を使用している場合は、信号部分はまた、 "ユーザー"モデルで気にします。私の理解が正しいとすれば、models.pyは空になります。私は元のクエリのsnippetを私の現在のlook for models.py – user3521180

+0

で最後に追加しましたが、少なくとも私は "User"モデルのdjango 1.11ドキュメントを使いました。それが持っているすべての機能はそこに記載されています。それを説明するものではありません、それらを使用する方法とそれらを使用する場合は、その部分で私を助けることができれば、それは素晴らしいでしょう。 – user3521180