在使用ModelForm创建的表单对象中设置用户字段

时间:2012-01-29 20:29:14

标签: python django forms post

我有一个注册表单,当用户在其中输入有效的注册数据时,它会将用户登录并将用户重定向到另一个表单以输入更多数据。这个新表单包含有关用户的更多数据,并使用下面的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)

无论哪种方式,我尝试它似乎不会将数据保存到数据库。然而,它会将我重定向到成功页面,就像它确实成功保存一样。

3 个答案:

答案 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()

因此,只需在保存模型对象后添加最后一段代码。