如何使用参数检索对象?

时间:2012-09-25 14:18:06

标签: python django django-models django-views

我正在尝试根据user_id选择某个用户,但遇到了一些麻烦。我收到一条错误,说“使用基数为10的int()的无效文字”:

代码的相关部分如下:

urls.py

url(r'^user/(?P<user_id>[-\w]+)/$', 'view_reviews_user'),

models.py

class UserProfile(models.Model):
    user = models.ForeignKey(User, primary_key=True)
    quote = models.CharField('About', max_length =  200, null=True, blank=True)

views.py

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”,但似乎也没有用。我试图最终访问模板中的“引用”。有什么建议吗?

2 个答案:

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