Если я пытаюсь создать приложение diray, используя django, как я могу заставить его показывать разные записи в дневнике в зависимости от текущего пользователя, вошедшего в систему?
В настоящее время я занимаюсь созданием приложения дневника на django. Я создал несколько пользователей (например, пользователь A и пользователь B). Однако, когда пользователь A входит в систему, пользователь A может видеть записи пользователя B.
Как я могу заблокировать его, чтобы только пользователь B мог видеть записи пользователя B, а когда пользователь A входит в систему, пользователь A может иметь личный вид записей? (нужно ли мне создать другое представление?)
views.py для моего приложения дневника:
from django.urls import reverse_lazy
from django.views.generic import (
ListView,
DetailView,
CreateView,
UpdateView,
DeleteView,
)
from .models import Entry
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect
# Create your views here.
class ELV(ListView):
model = Entry
queryset = Entry.objects.all().order_by("-date_created") #takes all the entries and orders it by date
template_name = 'entries\entry_list.html'
class EDV(DetailView):
model = Entry
template_name = 'entries\entry_detail.html'
class ECV(CreateView):
model = Entry
fields = ["title", "content"]
success_url = reverse_lazy("entry-list")
template_name = 'entries\entry_form.html'
class EUV(UpdateView):
model = Entry
fields = ["title", "content"]
template_name = 'entries\entry_update_form.html'
def get_success_url(self):
return reverse_lazy(
"entry-detail",
kwargs={"pk": self.object.pk}
)
class EntryDeleteView(DeleteView):
model = Entry
success_url = reverse_lazy("entry-list")
template_name = 'entries\entry_delete.html'
Имеет ли это какое-либо отношение к пользовательским сессиям? - Я не уверен, пожалуйста, помогите!
Да, вы можете сделать это легко. Но перед этим вы должны добавить дополнительное поле в вашу модель Entry
.
# models.py
from django.contrib.auth import get_user_model
User = get_user_model()
class Entry(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='entries')
# your other remaining fields
и обязательно выполните команды makemigrations
и migrate
после добавления нового поля. А в вашем файле views.py
добавьте команду get_queryset(self)
# Create your views here.
class ELV(ListView):
model = Entry
template_name = 'entries\entry_list.html'
def get_queryset(self):
return Entry.objects.filter(user=self.request.user).order_by("-date_created")
PS: И неплохо бы добавить LoginRequiredMixin
, чтобы убедиться, что только authenticated
получил доступ, который вы ListView
from django.contrib.auth.mixins import LoginRequiredMixin
class ELV(LoginRequiredMixin, ListView):
# ...
Вот ссылка docs
Мне также нужно было добавить этот бит к моему представлению создания входа (ECV), как только это было сделано, все заработало как шарм!
def form_valid(self, form):
form.instance.user = self.request.user
return super(ECV, self).form_valid(form)