我是 Django 的新手,現在我創建了一個站點,允許用戶注冊/登錄,通過條目資料庫中的“用戶”欄位創建與該用戶關聯的條目。
通過添加get_queryset()僅回傳當前用戶條目的方法,我設法獲得了隱藏其他用戶條目的所有功能。
但我覺得這是一種糟糕的做法。我覺得我重用了很多代碼,并且可能有后門來顯示其他用戶的條目。
有沒有辦法完全禁用當前用戶的其他用戶條目,而不僅僅是不顯示它?
視圖.py
class EntryListView(LockedView, ListView):
model = Entry
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user).order_by("-date_created")
class EntryDetailView(LockedView, DetailView):
model = Entry
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)
class EntryCreateView(LockedView, SuccessMessageMixin, CreateView):
model = Entry
fields = ["title", "content"]
success_url = reverse_lazy("entry-list")
success_message = "Your new entry was created!"
def form_valid(self, form):
user = self.request.user
form.instance.user = user
return super(EntryCreateView, self).form_valid(form)
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)
class EntryUpdateView(LockedView, SuccessMessageMixin, UpdateView):
model = Entry
fields = ["title", "content"]
success_message = "Your entry was updated!"
def get_success_url(self):
return reverse_lazy(
"entry-detail",
kwargs={"pk": self.object.pk}
)
def get_queryset(self):
return super().get_queryset().filter(user=self.request.user)
uj5u.com熱心網友回復:
Create、Detail 和 Update 視圖指的是單個條目(并且與該條目的關系是從 url kwarg 建立的(它可以是通用的“pk”或“slug”等),因此這 3 個視圖中的 get_queryset 實際上并沒有幫助。
如果您在瀏覽器中打開一個條目,您將看到 url 類似于 /entry/<id_of_entry> 因此如果您更改該值,您將訪問不同的物件。如果你想阻止用戶訪問不屬于他們的條目,你可以像這樣創建一些 mixin:
class EntryMixin:
"""
Prevent users to access entries that has different author
"""
def dispatch(self, request, *args, **kwargs):
if not self.get_object().user == request.user:
raise PermissionError
return super().dispatch(request, *args, **kwargs)
這里發生的事情是每次當用戶訪問某個視圖時,它會檢查他是否被分配給那個物件(注意這個 mixin 只適用于單個物件視圖(細節,更新,洗掉),因為串列需要修改。
uj5u.com熱心網友回復:
為Entry模型創建序列化程式并提供要顯示的欄位。使用戶欄位只讀,以便。
序列化程式.py
from rest_framework import serializers
class EntriesSerializer(serializers.ModelSerializer):
class Meta:
model = Entry
fields = '__all__'
extra_kwargs = {
'user': {'read_only': True}
}
然后為可以輕松執行 crud 操作的條目創建一個視圖集。覆寫get_queryset獲取當前用戶記錄的方法。還覆寫perform_create方法以在創建新記錄時將當前用戶提供為 entry'e 用戶。
視圖.py
from rest_framework import viewsets, mixins
from .serializers import EntriesSerializer
class EntriesViewSet(
mixins.CreateModelMixin,
mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
mixins.UpdateModelMixin,
viewsets.GenericViewSet
):
serializer_class = EntriesSerializer
def get_queryset(self):
queryset = Entry.objects.filter(user=self.request.user)
return queryset
def perform_create(self, serializer):
serializer.save(user=self.request.user)
為視圖集創建一個路由器并將視圖集注冊到路由器。然后在 urlpatterns 中包含路由器的 url。
網址.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from . import views
router = DefaultRouter()
router.register('entries', EntriesViewSet, basename='entries')
urlpatterns = [
path('', include(router.urls)),
]
現在,您可以通過訪問當前用戶創建的所有條目的串列/entries/并獲取單個條目使用的詳細資訊/entries/<entry_id>/。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332889.html
上一篇:使用IsActive更新記錄
下一篇:如何自動從多個表中選擇一列
