我有一个注册表单,当用户在其中输入有效的注册数据时,它会将用户登录并将用户重定向到另一个表单以输入更多数据。这个新表单包含有关用户的更多数据,并使用下面的ModelForm类创建:
class UserProfileAddForm(ModelForm):
class Meta:
model = UserProfile
exclude = ('user')
,UserProfile模型如下:
class UserProfile(models.Model):
GRADE_YEAR_CHOICES = (
('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate')
)
school = models.CharField(max_length=64)
grade_year = models.CharField(max_length=2, choices=GRADE_YEAR_CHOICES)
gpa = models.DecimalField(decimal_places=2, max_digits=6, blank=True, null=True)
user = models.ForeignKey(User, unique=True)
其中user字段是Django的User对象的ForeignKey。我很难将用户字段设置为发出请求的用户。这是我在views.py
中尝试的内容首次尝试:
def more(request):
if request.method == 'POST':
form = UserProfileAddForm(request.POST)
if form.is_valid():
form.save(commit=False)
form.user = request.user
form.save()
return HttpResponseRedirect('/register/success/')
else:
form = UserProfileAddForm()
variables = RequestContext(request, {
'form': form
第二次尝试:
def more(request):
if request.method == 'POST':
form = UserProfileAddForm(request.POST)
if form.is_valid():
form.save(commit=False)
form.user = User.objects.filter(username=request.user)
form.save()
return HttpResponseRedirect('/register/success/')
else:
form = UserProfileAddForm()
variables = RequestContext(request, {
'form': form
})
return render_to_response('registration/more.html', variables)
无论哪种方式,我尝试它似乎不会将数据保存到数据库。然而,它会将我重定向到成功页面,就像它确实成功保存一样。
答案 0 :(得分:2)
form.save()
返回正在保存的模型的实例。您需要设置用户,然后保存该实例。
profile = form.save(commit=False)
profile.user = request.user
profile.save()
请注意,根据request.user
的值从数据库中获取用户是没有意义的,因为request.user
已经是正确的用户对象。
答案 1 :(得分:1)
我的建议是你在第二次尝试时做出这个改变:
with_profile = form.save(commit=False)
with_profile.user = request.user
form.save()
...
问题是您要将user
属性添加到form
对象insteat到form.instance
对象。
<强>被修改强>
当我发布第一个答案时,我误认为是用户设置。 @Dirk在下面对此进行了评论,现在已修复。谢谢@Dirk。问题是查询集被分配给with_profile.user
在单个模型中。
答案 2 :(得分:0)
嗯,您需要了解的是,当您这样做时,您将获得模型实例 即在你的情况下
profile = form.save(commit =False)
当您保存模型对象时,它不会保存任何“多对多”关系。保存模型对象后需要执行的操作。通过这样做,
form.save_m2m()
因此,只需在保存模型对象后添加最后一段代码。