0

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」を試しましたが、うまくいかないようです。最終的にテンプレートの「quote」にアクセスしようとしています。何かアドバイス?

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 は存在しない可能性があります。あなたはそれを処理する必要があります。get_object_or_404最も簡単な方法は、次のようなdjango ショートカットを使用することです。

get_object_or_404(UserProfile, pk=user_id)

PS: 外部キーをUserwithinに使用することはお勧めしませんUserProfile。ユーザーとそのプロファイルの間には 1 対 1 の関係がOneToOneFieldあるため、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 ID は int です。文字列を使用する場合は、モデルに'sharat'a を追加してSlugFieldからスラッグをクエリする必要があります。

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