2017-03-09 3 views
0

表示オブジェクトを作成したユーザーに制限しようとしています。 オブジェクトモデルで外部キーを使用していますか?detailviewクラスを使用してオブジェクトへのアクセスを制限する方法

例: ユーザー1は、対象物1 ユーザー2は、任意のユーザがちょうどそのオブジェクトへの正しいURLを入力する任意のオブジェクトにアクセスすることができますこの時点ではオブジェクト2

にアクセスすることがアクセスすることができます。

ファイルviews.py

from django.shortcuts import render 
from django.http.response import Http404 
from .models import Host 
from django.views.generic.detail import DetailView 
from django.views.generic.list import ListView 
from django.contrib.auth.decorators import login_required 
# Create your views here. 


def index(request): 
    return render(request, 'index.html') 


class HostDetail(DetailView): 

    model = Host 

    def get_context_data(self, **kwargs): 
     context = super(HostDetail, self).get_context_data(**kwargs) 
     return context 


class HostList(ListView): 

    model = Host 

    def get_queryset(self, **kwargs): 

     qs = super(HostList, self).get_queryset(**kwargs).filter(perfil=self.request.user.perfil.id) 
     return qs 

ファイルmodels.py

class Perfil(models.Model): 

    usuario = models.OneToOneField(User, on_delete=models.CASCADE) 
    zbx_user = models.CharField(max_length=255, null=False) 
    pwd = models.CharField(max_length=255, null=False) 
    nome = models.CharField(max_length=255, null=False) 
    grupo = models.CharField(max_length=255, null=False) 
    numero_hosts = models.IntegerField(null=True) 

    def __str__(self): 

     return self.nome 

class Host(models.Model): 

    host_name = models.CharField(max_length=120) 
    templateid = models.PositiveIntegerField() 
    tipo = models.PositiveIntegerField() 
    ip = models.GenericIPAddressField() 
    dns = models.CharField(max_length=120, default="") 
    host_id = models.PositiveIntegerField() 
    # Relacionamento 1 pra N com Perfil 
    perfil = models.ForeignKey(Perfil, on_delete=models.CASCADE) 

    def __str__(self): 
     return self.host_name 

ファイル

urls.py
from django.conf.urls import url 
from . import views 
from django.conf.urls.static import static 
from django.conf import settings 
from .views import HostDetail, HostList 

urlpatterns = [ 

    # Rota para index perfis 
    url(r'^$', views.index, name='index'), 
    url(r'^host/(?P<pk>\d+)$', HostDetail.as_view(), name='HostDetail'), 
    url(r'^host/$', HostList.as_view(), name='HostList'), 

おかげ

答えて

1

あなたが使うのと同じアプローチを使用しますListViewself.request.userを使用してクエリーセットをフィルタリングします。

両方のビューでLoginRequiredMixinを使用して、ログインしているユーザーのみがビューにアクセスできるようにすることもできます。

from django.contrib.auth.mixins import LoginRequiredMixin 

class HostDetail(LoginRequiredMixin, DetailView): 
    model = Host 

    def get_queryset(self): 
     qs = super(HostList, self).get_queryset().filter(perfil=self.request.user.perfil_id) 
     return qs 

    ... 
+0

こんにちは@Alasdair、それは問題を解決したようです。しかし私はちょっと混乱しています。私は 'get_context_data()'を取り除いて正常に動作しました。いつ私はそれを使用する必要がありますか?ありがとう! –

+0

私は 'get_context_data'を質問に関連していないので除外しました。私はそれを削除するつもりはありませんでした。 'get_context_data'をオーバーライドするのは、コンテキストをカスタマイズしたい場合にのみ便利です。例については、コンテキストに 'now'を追加する[docsの例](https://docs.djangoproject.com/en/1.10/ref/class-based-views/generic-display/#detailview)を参照してください。あなたのケースでは、あなたがしたのは 'super()'の結果を返すことだったので、それを削除しても問題ありません。 – Alasdair

0

DetailViewクラスのdispatch()メソッドをオーバーライドします。

def dispatch(self, *args, **kwargs): 
    # Custom user permission check 
    return super(HostDetail, self).dispatch(*args, **kwargs) 
関連する問題