表示オブジェクトを作成したユーザーに制限しようとしています。 オブジェクトモデルで外部キーを使用していますか?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.pyfrom 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'),
おかげ
こんにちは@Alasdair、それは問題を解決したようです。しかし私はちょっと混乱しています。私は 'get_context_data()'を取り除いて正常に動作しました。いつ私はそれを使用する必要がありますか?ありがとう! –
私は 'get_context_data'を質問に関連していないので除外しました。私はそれを削除するつもりはありませんでした。 'get_context_data'をオーバーライドするのは、コンテキストをカスタマイズしたい場合にのみ便利です。例については、コンテキストに 'now'を追加する[docsの例](https://docs.djangoproject.com/en/1.10/ref/class-based-views/generic-display/#detailview)を参照してください。あなたのケースでは、あなたがしたのは 'super()'の結果を返すことだったので、それを削除しても問題ありません。 – Alasdair