2016-11-25 13 views
0

こんにちは皆さん、私の英語を口実にしています.... 私はdjangoの問題に直面しています。 所有者だけが印刷できるようにオブジェクトを制限する必要があります。Django CBV Detailview

Model.py

class Post(models.Model): 
title = models.CharField(max_length=50, blank=False) 
prenom = models.CharField(max_length=255, blank=False) 
user = models.ForeignKey(User, null=False) 

View.py

class detailpost(DetailView): 
model = Post 
template_name = 'detail-post.html' 
context_object_name = 'post' 

url.py

url(r'detail-post/(?P<pk>[-\d]+)$', views.detailpost.as_view(), name='detailpost'), 

これが正常に動作しますが、問題は、すべてのユーザーがのポストにアクセスできるということです別のユーザー(http://localhost:8000/detail-post/1)。だから私の質問は、ページをレンダリングするためのいくつかのことを行うことができます。もしそうなら現在のユーザーが投稿を所有しているかどうかを確認します。そうでなければユーザーを別のページにリダイレクトします。

答えて

0
あなたには、GET()またはポスト()メソッドをオーバーライドすることができます

ビュークラス

​​
+0

ありがとうございますそれはうまく動作します。私はすべてのユーザーが自分の投稿にアクセスできるように、request.user.is_superuserを削除するだけです。 – user3418337

1

LoginRequiredMixin(Django 1.9の新機能)を使用して、ログインしているユーザーだけがビューにアクセスできることを確認できます。

次に、get_querysetメソッドをオーバーライドし、クエリーセットをフィルタリングして、ログインしているユーザーの投稿のみを含むようにします。

from django.contrib.auth.mixins import LoginRequiredMixin 

class DetailPost(LoginRequiredMixin, DetailView): 
    model = Post 
    template_name = 'detail-post.html' 
    context_object_name = 'post' 

    def get_queryset(self): 
     queryset = super(DetailPost, self).get_queryset() 
     return queryset.filter(owner=self.request.user) 

ユーザーが属していない投稿を表示すると、404ページが表示されます。 404を表示する代わりにユーザーをリダイレクトする必要がある場合は、別の方法をとる必要があります。私はあなたのクラスDetailPostを(キャメルケースはジャンゴのクラスのために推奨されています。あなたが同様にあなたのurls.pyを更新する必要があります。名前を変更した

0

それは以下のようなものになるようにあなたは、あなたの「detailpost」クラスでオーバーライドする「(取得)」メソッド必要があります。

def get(self, request, *args, **kwargs): 
    queryset = self.model._default_manager.filter(user=request.user) 
    self.object = self.get_object(queryset) 
    context = self.get_context_data(object=self.object) 
    return self.render_to_response(context) 

それはリットルと思われますそれは、ユーザーをリクエストインスタンスからフィルタクエリーセットに渡す唯一の方法です。 私はそれを見つけませんでしたDetailViewの使用self.request

関連する問題