2015-10-28 58 views
0

我真的很想用Django構建這個應用程序,讓人們註冊並創建可以編輯的用戶實例。每個User實例已經與OneToOne的UserProfile鏈接,因爲我不想混淆原始User模型。如果該用戶登錄,UserProfile將具有他/她可以註冊遊戲的字段。如何鏈接這兩個模型,以便更新同一個實例?

即,比利想報名參加星期一粉碎近戰。他登錄後,單擊表單上的選項,鏈接到用戶的UserProfile將更新註冊的遊戲選項和用戶標籤到用戶配置文件。

鏈接到用戶的用戶配置文件的部分工作正常,但我不知道如何使用新的錦標賽註冊表更新UserProfile,以便它可以更改鏈接到記錄用戶的UserProfile字段在

Django模型:

class UserProfile(models.Model): 
#User profile for registered users. SEPARATE USERBASE TO PLAYER_RANKING 
#To Do: add more customizeability and more access for registered. 
#weekly e-mails, ability to register for weeklies... 
user = models.OneToOneField(User) 
picture = models.ImageField(upload_to='profile_images', blank=True) 


MON = 'ME' 
TUE = 'S4' 
THR = 'PM' 
reg_game_choices = (
    (MON, "Melee"), 
    (TUE, "Smash 4"), 
    (THR, "PM"), 
    ) 
reg_game_choice = models.CharField(max_length=2, 
            choices=reg_game_choices, 
            default="") 
user_tag = models.CharField(max_length=60, default = "") 

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

形式:

class UserForm(forms.ModelForm): 
password = forms.CharField(widget=forms.PasswordInput()) 

class Meta: 
    model = User 
    fields = ('username', 'password') 

class UserProfileForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('picture',) 

class TournyRegForm(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('reg_game_choice', 'user_tag',) 

查看:

@login_required 
def tourny_reg(request): 
    #Registering for tournaments 
    context_dict = {} 

    weekday = datetime.datetime.today().weekday() 
    day_names = ['MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'] 
    game_days = ['SMASH MELEE', 'SMASH 4', 'CLOSED', 'PROJECT M &  FIGHTING GAMES', 
      'FRIENDLIES', 'CLOSED', 'CLOSED'] 
    day_title = day_names[weekday] 
    game_day = game_days[weekday] 


    context_dict['day'] = day_title 
    context_dict['game_of_the_day'] = game_day 

    if request.method == 'POST': 
     tourny_form = TournyRegForm(data=request.POST) 
     if tourny_form.is_valid(): 
      tourny_form.save() 
     else: 
      print (tourny_form.errors) 
    else: 
     tourny_form = TournyRegForm() 

    context_dict['tourny_form'] = tourny_form 



return render(request, 'Kappa/tourny_reg.html', context_dict) 

它在html和本地服務器上顯示得非常好,但是當我嘗試時,它會給我一個完整性錯誤。

IntegrityError在/卡帕/ tourny_reg/

NOT NULL約束失敗:Kappa_userprofile.user_id 異常值:

NOT NULL約束失敗:Kappa_userprofile.user_id ▶本地變量 C:\用戶\凱爾\ Documents \ GitHub \ Kappa_Ranks \ Kappa \ views.py在tourny_reg

回答

1

所以基本上,你想知道如何保存一個與登錄用戶相關的東西的實例。這很容易。

解釋爲什麼你會得到一個NOT NULL錯誤:你的TournyRegForm類沒有被告知顯示'用戶'的輸入字段,所以它不是。所以當你去保存表單時,用戶字段中沒有填充任何內容。數據庫抱怨是因爲'NOT NULL'字段有NULL值,這是一個問題..所以這個錯誤是合法的。

但是沒關係,這個字段不在表單中..因爲你不想讓用戶通過表單告訴我們他們是誰,你想通過它們是事實來獲得關於他們是誰的信息Django驗證模塊將這些信息放入請求對象中,您可以輕鬆獲取它。所有你需要做的是填寫正確的用戶模型保存之前,像這樣:

if tourny_form.is_valid(): 
    # commit= False tells the modelform to just create the model instance 
    # but don't save it yet. 
    user_profile = tourny_form.save(commit=False) 
    # associate this user_profile with the logged in user.. it is always 
    # present in the request object if you are using django's   auth module. 
    user_profile.user = request.user 
    # now save it 
    user_profile.save() 

這樣會保存這是關係到當前登錄的用戶模型的照顧。但是你還有其他問題。例如,你是否想每次保存一個新的UserProfile?我不認爲你做的。所以在你得到你需要做這樣的事情:

user_profile = UserProfile.objects.filter(user=request.user).first() 
tourny_form = TournyRegForm(instance=user_profile) 

這將在用戶從數據庫中讀取當前登錄=的用戶配置,然後初始化與形式實例,所以當用戶回來時,他們將能夠編輯他們的個人資料。

現在,如果您確實希望用戶能夠註冊多個遊戲..您需要一個遊戲模型來存儲遊戲信息,並且與您的UserProfile具有一對多的關係。這通過在遊戲模型中有一個ForeignKey字段與UserProfile相關聯,所以每個用戶只有一個UserProfile,但可以有多個遊戲。

+0

這是什麼魔術......它的工作原理。 –

相關問題