2012-09-25 145 views
0

我試圖根據user_id選擇某個用戶,但我遇到了一些麻煩。我得到一個錯誤說 「無效的字面INT()基數爲10」:如何使用參數檢索對象?

代碼的相關部分如下:

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」,但這似乎也不起作用。我試圖最終訪問模板中的「引用」。有什麼建議?

+0

你肯定user_id是一個整數值? – aga

+0

這是你所看到的所有代碼,還是你將零件切割出來?你得到的錯誤表明'user_id'的值不是一個整數或者不能被轉換成一個整數(一個帶有數字的字符串,即'3')。請粘貼*您的視圖的所有代碼,或者從您的urlconf中粘貼相關的代碼。 –

+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但該用戶標識可能不存在。你應該處理。最簡單的方法就是使用Django快捷get_object_or_404像:

get_object_or_404(UserProfile, pk=user_id) 

PS:這不是推薦使用內UserProfile一個外鍵到User。由於用戶與其配置文件之間存在一對一的關係,因此您應該使用OneToOneField而不是ForeignKey

編輯

如果你希望能夠通過自己的用戶名,而不是他們的ID來查詢的用戶,你可以這樣做:

def view_reviews_user(request, username): 
    userprofile = get_object_or_404(UserProfile, user__username=username) 
1

user_id是一個字符串。 Django的ID是整數,如果你想使用像'sharat'一個字符串,你應該添加一個SlugField到模型,然後查詢毛坯:

def view_reviews_user(request, slug): 
    userprofile = UserProfile.objects.get(slug=slug)