modelforms中的ValueError
我正在使用modelforms来获取播放列表及其项目。这个功能还包含了登录脚本。我想把当前登录的用户设置到用户模型中。你可以看看我之前发过的这个内容:
class playlistmodel(models.Model):
user = models.ForeignKey(User)
title = models.CharField(max_length=200)
def __unicode__(self):
return self.title
class itemsmodel(models.Model):
playlist = models.ForeignKey(playlistmodel)
item = models.TextField()
def __unicode(self):
return self.item
class playlistform(ModelForm):
class Meta:
model = playlistmodel
exclude = {'user'}
class itemsform(ModelForm):
class Meta:
model = itemsmodel
exclude = {'playlist'}
这是播放列表的视图:
def playlistview(request):
if request.method == 'POST':
form = playlistform(request.POST)
if form.is_valid():
data = form.save(commit=False)
data.user = request.user
data.save()
return render_to_response('playlist.html', {'data': data})
else:
form = playlistform()
return render_to_response('playlist.html', {'form': form, 'user': request.user}, context_instance=RequestContext(request))
Playlist.html文件:
https://gist.github.com/1576136
错误页面:
https://gist.github.com/1576186
但是我遇到了一个ValueError
错误:
Exception Type: ValueError Exception Value: Cannot assign "<django.utils.functional.SimpleLazyObject object at 0x7f0234028f50>": "playlistmodel.user" must be a "User" instance
Traceback: Local vars --- data.user = request.user
这是我的settings.py文件:
https://gist.github.com/1575856
谢谢你。
3 个回答
我也遇到了同样的问题,但这个问题只在没有用户登录的时候出现(这时候会期待一个 AnonymousUser
实例)。至少当我的超级用户登录时,我没有发现任何问题。
虽然我还没有找到解决办法,但也许你可以在这个 回答 中找到一些线索。
好吧,现在我意识到在我的情况下,AnonymousUser 应该在数据库中存储为 null,不过我留这个回答是为了分享那个线索链接(我还没有权限留言)。
希望这能帮到你!
这很难说,但我建议你在你的播放列表视图中试试这个:
form = playlistform(request, request.POST, instance=playlistmodel)
也许你可以省略最后一个参数(instance=playlistmodel),因为只有在你要修改一个已经存在的对象时才需要这个参数。
希望这对你有帮助...
我知道这个帖子有点旧了,但如果有人遇到同样的问题,答案是 request.user
实际上是 Django 的 auth.user
的一个包装器。
所以 request.user
是一个 SimpleLazyObject
,它的目的是为了避免不必要的实例化,同时也实现了一个简单的用户缓存机制。
要访问实际的用户(并在第一次访问时进行实例化),你需要这样做:
auth.get_user(request)
这样你就能得到一个 auth.user
的实例。
如果你想了解内部发生了什么,可以查看 这个帖子。