我正在尝试根据user_id选择某个用户,但遇到了一些麻烦。我收到一条错误,说“使用基数为10的int()的无效文字”:
代码的相关部分如下:
url(r'^user/(?P<user_id>[-\w]+)/$', 'view_reviews_user'),
class UserProfile(models.Model):
user = models.ForeignKey(User, primary_key=True)
quote = models.CharField('About', max_length = 200, null=True, blank=True)
def view_reviews_user(request, user_id):
reviews = Reviewbackup.objects.filter(user=user_id)
reviews = reviews.order_by("-created_on")
userprofile = UserProfile.objects.get(user=user_id)
return render_to_response('reserve/templates/user.html', {'reviews':reviews, 'user_id': user_id, 'userprofile': userprofile},
context_instance=RequestContext(request))
我认为错误发生在“pk = user_id”中,但我不确定如何修复它。我试过“user_id = user_id”,但似乎也没有用。我试图最终访问模板中的“引用”。有什么建议吗?
答案 0 :(得分:2)
你必须记住在调用视图之前发生了什么。
Django使用正则表达式将url与某些模式匹配。现在通常正则表达式将包含其中的组,以便能够从那里解析出一些ID。 Django将采用这些ID并将它们传递给视图。但是,由于它只使用正则表达式,因此即使您的组与(?P<user_id>\d+)
类似,这些组的值也将是字符串。
因此,在您的视图中,user_id
是一个字符串,而模型中的外键是一个整数,因此Django想要一个整数来进行查询。您所要做的就是将值转换为整数,您应该没问题(请参阅下文,了解如何确保user_id
中不包含其他非整数字符):
def view_reviews_user(request, user_id):
userprofile = UserProfile.objects.get(pk=int(user_id))
即使这样可行,但很多事情都可能出错。
如果用户没有输入整数怎么办?这可以通过使用\d+
在urlconfig中的正则表达式中轻松修复,如果只有整数,它只会匹配表达式。因此,您可以确定int(user_id)
不会引发问题。
url(r'^user/(?P<user_id>\d+)/$', 'view_reviews_user'),
如果找不到用户怎么办?用户可能提供user_id
但该用户ID可能不存在。你应该处理。最简单的方法是使用django快捷方式get_object_or_404
,如:
get_object_or_404(UserProfile, pk=user_id)
PS:不建议在User
内使用UserProfile
的外键。由于用户与其个人资料之间存在一对一的关系,因此您应该使用OneToOneField
而不是ForeignKey
。
修改强>
如果您希望能够通过用户名而不是ID来查询用户,可以这样做:
def view_reviews_user(request, username):
userprofile = get_object_or_404(UserProfile, user__username=username)
答案 1 :(得分:1)
您的user_id
是一个字符串。 Django id是整数,如果你想使用像'sharat'
这样的字符串,你应该在模型中添加SlugField
,然后查询slug:
def view_reviews_user(request, slug):
userprofile = UserProfile.objects.get(slug=slug)