6

URL パターンを定義するときは、正規表現を使用して URL から PK を取得することになっています。

PK のない URL が必要な場合はどうすればよいですか? また、それが提供されていない場合、現在ログインしているユーザーが使用されますか? 例:

  • 訪問/userすると、現在ログインしているユーザーの DetailView が取得されます
  • /user/edit現在ログインしているユーザーの UpdateView を表示します

呼び出しで をハードコーディングしようとしpk=ましたDetail.as_view()が、無効なキーワードが報告されます。

URL conf でそれを指定するにはどうすればよいですか?

/userURLにアクセスするときにPKが必要なエラーを示す私のサンプルコード:

urlpatterns = patterns('',
    url(r'user/$', 
        DetailView.as_view(
            model=Account,
            template_name='user/detail.html')),
)`
4

4 に答える 4

8

別のアプローチは、サブクラスのget_objectメソッドをオーバーライドすることです。次のようなものです。DetailView

class CurrentUserDetailView(UserDetailView):
    def get_object(self):
        return self.request.user

ミックスインのアプローチよりも、はるかにクリーンでシンプルで、クラスベースのビューの精神に沿っています。

編集: 明確にするために、2 つの異なる URL パターン (つまり、a のあるものpkとないもの) を urlconf で別々に定義する必要があると思います。したがって、特にこれによりコードがよりクリーンになるため、これらは 2 つの異なるビューでも提供できます。この場合、urlconf は次のようになります。

urlpatterns = patterns('',
    url(r"^users/(?P<pk>\d+)/$", UserDetailView.as_view(), name="user_detail"),
    url(r"^users/current/$", CurrentUserDetailView.as_view(), name="current_user_detail"),
    url(r"^users/$", UserListView.as_view(), name="user_list"),
)

そして、上記の例を更新して、 を継承していることに注意してくださいUserDetailView。これにより、よりクリーンになり、親ビューの特殊なケースであることが実際に何であるかが明確になります。

于 2013-03-05T11:25:51.657 に答える
2

私の知る限り、その情報にアクセスできないため、URL 定義でそれを定義することはできません。

ただし、独自の mixin を作成し、それを使用して、必要に応じて動作するビューを構築することができます。

ミックスインは次のようになります。

class CurrentUserMixin(object):
    model = Account

    def get_object(self, *args, **kwargs):
        try:
            obj = super(CurrentUserMixin, self).get_object(*args, **kwargs)
        except AttributeError:
            # SingleObjectMixin throws an AttributeError when no pk or slug
            # is present on the url. In those cases, we use the current user
            obj = self.request.user.account

        return obj

次に、カスタム ビューを作成します。

class UserDetailView(CurrentUserMixin, DetailView):
    pass

class UserUpdateView(CurrentUserMixin, UpdateView):
    pass
于 2013-03-05T04:52:22.150 に答える
0

ジェネリック ビューは always を使用しますRequestContext。そして、Django ドキュメントのこの段落には、認証アプリで RequestContext を使用すると、user現在ログインしているユーザーを表す変数がテンプレートに渡されることが示されています。

于 2013-03-05T03:39:56.967 に答える
0

request オブジェクトから現在のユーザーの詳細を取得できます。別のユーザーの詳細を表示したい場合は、URL をパラメーターとして渡すことができます。URL は次のようにエンコードされます。

url(r'user/(?P<user_id>.*)$', 'views.user_details', name='user-details'),

views.user_details2 番目のパラメーターはuser_id文字列になります (URL の正規表現を変更して整数値を制限できますが、パラメーターは引き続き文字列型になります)。Django ドキュメントからの URL パターンの他の例のリストを次に示します。

于 2013-03-05T03:41:54.290 に答える