我有一個註冊表單,當用戶在其中輸入有效的註冊數據時,它將用戶登錄並將用戶重定向到另一表單以輸入更多數據。這種新的形式包含有關用戶的更多數據,並使用下面的ModelForm類創建:在使用ModelForm創建的表單對象中設置用戶字段
class UserProfileAddForm(ModelForm):
class Meta:
model = UserProfile
exclude = ('user')
和用戶配置模型的樣子:
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)
當用戶字段是一個ForeignKey到Django的User對象。我很難將用戶字段設置爲發出請求的用戶。以下是我在我的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)
無論哪種方式,我嘗試它似乎不救數據到數據庫。然而,它會將我重定向到成功頁面,就像它成功保存一樣。
完美運作。所以我理解它們之間的區別,在'form'對象中,你實際上不能改變實例的值,但是在'profile'對象中你可以?爲什麼我不能直接執行'form.user = request.user'? – 2012-01-29 21:33:00
@NicYoung,Django [表單對象包含一個Field對象的集合](https://docs.djangoproject.com/en/dev/topics/forms/#form-objects),你可以[在這裏閱讀](https ://docs.djangoproject.com/en/dev/ref/forms/fields/)與你試圖修改的對象沒有任何關係。 'form.save()'爲你保存的對象創建一個新的「實例」,這就是你可以修改的那個。 – Dirk 2012-01-29 21:40:22
@Dirk感謝您的澄清。所以實際上實例化對象使其可以修改。這是我必須習慣的。 – 2012-01-29 21:46:24