2017-05-21 2 views
0

캔트 저장 :장고 : 확장 된 사용자 모델 나는 다른 모델이라는 프로파일을 사용하여 장고 사용자 모델을 확장 한

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가 있습니까? POS 데이터가 있습니까? 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

자선 모델에 문제가 있습니다. 저를 무시하는 동안 무시하십시오 : ( –

관련 문제