2017-05-21 15 views
0

私は、プロファイルと呼ばれる別のモデルとDjangoのユーザモデルを拡張している:私は次のエラーを取得する以下のコードをビュー内の新しいユーザーを作成しようとするとジャンゴ:拡張ユーザーモデルカント保存

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    chosenCharity = models.ForeignKey('meta.Charity', db_column='chosenCharityid', related_name='user_chosenCharity') 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

"(1048年、 "列 'chosenCharityid' をNULLにすることはできません")":

@transaction.atomic 
def register(request): 
    selectedTeams = StraightredTeam.objects.filter(Q(teamid=request.session['team1id']) | Q(teamid=request.session['team2id'])).order_by('teamname') 
    request.POST.get('currentCharities') 

    next_url = request.POST.get('next', request.GET.get('next', reverse('straightred.payment'))) 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 

私は、ユーザーが既に作成しているときに私が使用できるようになります知っている:

user = User.objects.get(pk=user_id) 
user.profile.chosenCharity = 12 
user.save() 

しかし、私はユーザーの作成時にこれを行う方法がわかりません。どんな助けもありがとう。以下は

助けるために、登録フォームのコピーです:

class RegistrationForm(BootstrapModelForm, UserCreationForm): 
    email_opt_in = forms.BooleanField(label='Receive DWAD e-mail updates', required=False) 

    def __init__(self, *args, **kwargs): 
     super(RegistrationForm, self).__init__(*args, **kwargs) 
     # The default Django user model doesn't require these fields to be set 
     # but we do. 

     self.fields['email'].required = True 

    def clean_email(self): 
     email = self.cleaned_data['email'] 
     if User.objects.filter(email__iexact=email).exists(): 
      raise ValidationError('There is already an account registered with this e-mail address.') 
     return email 

    class Meta: 
     model = User 
     fields = ['first_name', 'last_name', 'email', 'username'] 

チャリティーモデル:

class Charity(models.Model): 
    name = models.CharField(max_length=50, unique=True) 
    website = models.URLField() 
    enabled = models.BooleanField(default=True) 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     ordering = ['name'] 
     verbose_name_plural = 'charities' 
+0

はchosenCharityはnullにすることはできません。プロフィールには慈善団体IDが必要です。オプションの場合、selectedCharityフィールドでnullをTrueに設定します。 –

+0

こんにちはZap、それはオプションではありませんが、私はちょうどビューでそれを設定する方法がわかりません。何かご意見は? –

+0

チャリティIDはリクエストにありますか?ポストデータですか? post_save信号を使用する代わりに、new_user = form.save()の直後にプロファイルオブジェクトを作成することができます。 –

答えて

1

がpost_save信号にプロファイルオブジェクトを作成しないでください。 create_user_profileメソッドで必要なチャリティIDにアクセスすることはできません。その部分を削除してください。

ではなく、あなたがこのようなあなたのregisterビューでユーザーオブジェクトを保存した直後にプロファイルオブジェクトを保存します。

@transaction.atomic 
def register(request): 
    selectedTeams = StraightredTeam.objects.filter(Q(teamid=request.session['team1id']) | Q(teamid=request.session['team2id'])).order_by('teamname') 
    request.POST.get('currentCharities') 

    next_url = request.POST.get('next', request.GET.get('next', reverse('straightred.payment'))) 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      new_user = form.save() 
      charity_id = request.session['chosenCharityid'] 
      # create profile object 
      Profile.objects.create(user=new_user, chosenCharity_id=charity_id) 

編集:私はあなたがpost_save信号を受信するために別の方法save_user_profileを使用していることがわかり

これも使用しないでください。それは単純なまっすぐ進むことのやり方についてのラウンドです。あなたは、コードサンプルを所有して使用

:create_user_profile信号受信機にプロファイルオブジェクトを保存するとき

user = User.objects.get(pk=user_id) 
# here you are assigning a new charity id to the profile object 
user.profile.chosenCharity = 12 
# you save the user object on which nothing has changed 
# instead you should save the profile object 
user.save() # no need 
user.profile.save() # direct and logical 
+0

私はあなたの助けに感謝しますが、これはちょうど私に "グローバル名 'プロファイル'は定義されていません"を与える。 –

+0

プロファイルモデルはどこに定義されていますか?それが正しくインポートされているかどうかを確認できますか? –

+0

私のチャリティモデルに問題があります。 –

関連する問題