2015-11-21 81 views
0

在我的models.py,我延長了用戶模式,由於採用了OneToOneField:爲什麼有些字段沒有保存在OneToOneField模型中?

class MyUser(User): 
    user = models.OneToOneField(User, primary_key=True) 
    # Extra fields: 
    favourite_colour = models.CharField(max_length=100, blank=False, null=False) 

    def __str__(self): 
     return self.user.username 

然後,在views.py,我試圖從形式保存:

def register(request): 
    if request.POST: 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      favourite_colour = form.cleaned_data['favourite_colour'] 
      new_user = User.objects.create_user(username=username, password=password) 
      new_user.save() 
      new_myuser = MyUser(user=new_user) 
      new_myuser.favourite_colour = favourite_colour 
      # IF I COMMENT OUT THE LINE BELOW, the fields of User are correctly saved 
      new_myuser.save() 

      # TESTING WHETHER IT'S SAVED : 
      print("{} was saved in User, with username = {}".format(new_user, new_user.username)) 

      return HttpResponseRedirect(reverse('home')) 
     else: 
      # display the page with the errors 
      return render(request, 'registration/registration_form.html', {'form': form}) 
    else: 
     # display the blank form: 
     form = UserForm() 
     return render(request, 'registration/registration_form.html', {'form': form}) 

如果我用例如我得到的簡單表格進行測試: person1 was saved in User, with username = person1

但是,如果我在我的數據庫查詢(db.sqlite3),創建的對象沒有用戶名或密碼,只有idis_superuseris_staffis_activedate_joined定義。

這就好像我的字段passwordusername被擦除後。

正如在代碼中評論指出,如果我註釋掉MyUser.save()(這是由一個OneToOneField掛User模型MyUser),裏面User的字段正確填寫(但鏈接模型MyUser保持爲空明顯)

+0

您也應該檢查是否'form.cleaned_data [ '用戶名']'和' form.cleaned_data ['password']'在那裏,然後在'new_user.save()'後面檢查'new_user'是否正確設置了'username'' password'。 –

回答

2

你在這裏混淆了兩個概念:繼承和關係。你已經聲明MyUser是從用戶繼承的;這意味着它會自動獲取用戶的所有字段。但你有定義了一個關係到用戶類;該關係中的用戶實例與您正在從中繼承的實例不同。

你不應該這樣做。如果你想創建一個關係,那麼做:去掉繼承,像你的代碼一樣分別創建實例,並且一切正常。

+0

這真是太愚蠢了!非常感謝指出我愚蠢的錯誤... – ThePhi

0

@丹尼爾羅斯曼是正確的。如果您想擴展您的用戶模型,則應該創建一個具有一對一關係的模型UserProfile。這是一個常見的模式:

models.py

class UserProfile(models.Model): 
    user = models.OneToOneField(User, relate_name='userprofile') 
    favourite_colour = models.CharField(max_length=100, blank=False, null=False) 

    def __str__(self): 
     return self.user.username 

def get_or_create_profile(user): 
    profile, created = UserProfile.objects.get_or_create(user=user) 
    return profile 

User.userprofile = property(get_or_create_profile) 

views.py

def register(request): 
    if request.POST: 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      favourite_colour = form.cleaned_data['favourite_colour'] 
      user = User.objects.create_user(username=username, password=password) 

      userprofile, created = UserProfile.objects.get_or_create(user=user) 
      if created: 
       userprofile.favourite_colour = favourite_colour 
       userprofile.save() 
      else: 
       print '... User/UserProfile already exists! Handle that here...' 

      return HttpResponseRedirect(reverse('home')) 
     else: 
      # display the page with the errors 
      return render(request, 'registration/registration_form.html', {'form': form}) 
    else: 
     # display the blank form: 
     form = UserForm() 
     return render(request, 'registration/registration_form.html', {'form': form}) 
相關問題