0

我正在尝试根据 user_id 选择某个用户,但遇到了一些麻烦。我收到一条错误消息:“invalid literal for int() with base 10”:

代码的相关部分如下:

网址.py

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

模型.py

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

视图.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”,但这似乎也不起作用。我最终试图访问模板中的“报价”。有什么建议吗?

4

2 回答 2

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

即使这会起作用,但这里很多事情都可能出错。

如果用户不输入整数怎么办?这很容易在 urlconfig 的正则表达式中通过使用\d+which 仅在只有整数时才匹配表达式来修复。因此,您可以确定这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)

UserPS: 不建议对inside使用外键UserProfile。由于用户与其个人资料之间存在一对一的关系,因此您应该使用 userOneToOneField而不是ForeignKey.

编辑

如果您希望能够通过用户名而不是他们的 id 来查询用户,您可以这样做:

def view_reviews_user(request, username):
    userprofile = get_object_or_404(UserProfile, user__username=username)
于 2012-09-25T14:39:36.780 回答
1

user_id的是一个字符串。Django ids 是整数,如果你想使用一个字符串,'sharat'你应该添加一个SlugField到你的模型,然后查询 slug:

def view_reviews_user(request, slug):
    userprofile = UserProfile.objects.get(slug=slug)
于 2012-09-25T14:44:50.550 回答