我如何 link 这两个模型,以便其中一个更新同一个实例?
How do I link these two models such that one will update that same instance?
我真的很想用 Django 构建这个应用程序,让人们注册和创建可以编辑的用户实例。每个 User 实例都已经通过 OneToOne 链接到一个 UserProfile,因为我不想弄乱原始的 User 模型。 UserProfile 将有一个字段,如果该人已登录,he/she 可以在其中注册游戏。
即。比利想报名参加周一粉碎混战。他登录,单击表单上的一个选项,链接到用户 Billy 的 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 和本地服务器上显示完美,但当我尝试时,它给我一个完整性错误。
/Kappa/tourny_reg/
处出现完整性错误
NOT NULL 约束失败:Kappa_userprofile.user_id
异常值:
NOT NULL 约束失败:Kappa_userprofile.user_id
▶ 本地变量
C:\Users\Kyle\Documents\GitHub\Kappa_Ranks\Kappa\views.py 在 tourny_reg
基本上,您想知道如何保存与登录用户相关的实例。很简单。
解释您收到 NOT NULL 错误的原因:您的 TournyRegForm class 没有被告知显示 'user' 的输入字段,所以它不是。因此,当您去保存表单时,None 正在为用户字段填写。数据库正在抱怨,因为 'NOT NULL' 字段有一个 NULL 值,这是一个问题..所以这个错误是合法的。
但是这个字段不在表单上也没关系。因为您不希望用户通过表单告诉我们他们是谁,您希望通过他们已登录。Django 身份验证模块将此信息放在 Request 对象中,您可以轻松获取它。您需要做的就是在保存模型之前填写正确的用户,如下所示:
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 吗?我不认为你这样做..所以在你的 GET 上你需要做这样的事情:
user_profile = UserProfile.objects.filter(user=request.user).first()
tourny_form = TournyRegForm(instance=user_profile)
这将从数据库中获取当前登录用户的 UserProfile,然后使用该实例初始化表单,这样当用户回来时他们将能够编辑他们的个人资料。
现在,如果您真的希望用户能够注册多个游戏..您将需要一个 Game 模型来存储游戏信息,并且与您的 UserProfile 具有一对多关系。这是通过在 Game 模型中有一个 ForeignKey 字段来实现的,该字段将它与 UserProfile 相关联。因此每个用户将只有一个 UserProfile 但可以有多个游戏。
我真的很想用 Django 构建这个应用程序,让人们注册和创建可以编辑的用户实例。每个 User 实例都已经通过 OneToOne 链接到一个 UserProfile,因为我不想弄乱原始的 User 模型。 UserProfile 将有一个字段,如果该人已登录,he/she 可以在其中注册游戏。
即。比利想报名参加周一粉碎混战。他登录,单击表单上的一个选项,链接到用户 Billy 的 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 和本地服务器上显示完美,但当我尝试时,它给我一个完整性错误。
/Kappa/tourny_reg/
处出现完整性错误NOT NULL 约束失败:Kappa_userprofile.user_id 异常值:
NOT NULL 约束失败:Kappa_userprofile.user_id ▶ 本地变量 C:\Users\Kyle\Documents\GitHub\Kappa_Ranks\Kappa\views.py 在 tourny_reg
基本上,您想知道如何保存与登录用户相关的实例。很简单。
解释您收到 NOT NULL 错误的原因:您的 TournyRegForm class 没有被告知显示 'user' 的输入字段,所以它不是。因此,当您去保存表单时,None 正在为用户字段填写。数据库正在抱怨,因为 'NOT NULL' 字段有一个 NULL 值,这是一个问题..所以这个错误是合法的。
但是这个字段不在表单上也没关系。因为您不希望用户通过表单告诉我们他们是谁,您希望通过他们已登录。Django 身份验证模块将此信息放在 Request 对象中,您可以轻松获取它。您需要做的就是在保存模型之前填写正确的用户,如下所示:
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 吗?我不认为你这样做..所以在你的 GET 上你需要做这样的事情:
user_profile = UserProfile.objects.filter(user=request.user).first()
tourny_form = TournyRegForm(instance=user_profile)
这将从数据库中获取当前登录用户的 UserProfile,然后使用该实例初始化表单,这样当用户回来时他们将能够编辑他们的个人资料。
现在,如果您真的希望用户能够注册多个游戏..您将需要一个 Game 模型来存储游戏信息,并且与您的 UserProfile 具有一对多关系。这是通过在 Game 模型中有一个 ForeignKey 字段来实现的,该字段将它与 UserProfile 相关联。因此每个用户将只有一个 UserProfile 但可以有多个游戏。