2016-11-25 4 views
0

안녕하세요 여러분, 제 영어를 실례합니다 .... 저는 장고에 문제가 있습니다. 소유자 만 개체를 ​​인쇄 할 수 있도록 개체를 제한해야합니다.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() 메소드를 오버라이드 (override) 할 수

뷰 클래스는 다음과 같이 될 수 있도록 당신은, 당신의 'detailpost'의 메소드() '얻을'오버라이드 (override) 할 필요가

from django.shortcuts import redirect 

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

    def get(self, request, *args, **kwargs): 
     self.post = Post.objects.get(pk=self.kwargs['pk']) 
     if self.post.user != request.user or not request.user.is_superuser: 
      return redirect('login') 
     else: 
      return super(detailpost, self).get(request, *args, **kwargs) 
+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을 (CamelCase를 장고 수업을 권장합니다. 당신은뿐만 아니라 당신의 urls.py를 업데이트해야합니다. 이름을 변경 한

0

는 :.

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