2016-11-25 93 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()或post()方法中您的視圖類

​​
+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類(建議爲駝峯在Django類。你必須更新你的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) 

看來升這是將User從Request實例傳遞給過濾器查詢集的唯一方法。 我沒有找到DetailView使用self.request