Django Как получить данные на основе их pk
Мне нужна приборная панель для сотрудников, которая может видеть все данные пользователей, а также CRUD. как я могу динамически фильтровать пк данных пользователей. Если я использую objects.all, я получаю все, но не могу редактировать определенные значения
from django.contrib.auth.mixins import UserPassesTestMixin
class AdminStaffRequiredMixin(LoginRequiredMixin, UserPassesTestMixin):
def test_func(self):
return self.request.user.is_superuser or self.request.user.is_staff
class Dashboard (AdminStaffRequiredMixin, LoginRequiredMixin, ListView):
model = SchulverzeichnisTabelle
template_name = 'SCHUK/Dashboard.html'
context_object_name = 'Dashboard'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['Schulverzeichnis'] = SchulverzeichnisTabelle.objects.all()
return context
Вы редактируете элемент с UpdateView
[Django-doc], поэтому:
from django.views.generic import UpdateView
class DashboardView(AdminStaffRequiredMixin, ListView):
model = SchulverzeichnisTabelle
template_name = 'SCHUK/Dashboard.html'
context_object_name = 'Schulverzeichnis'
class SchulverzeichnisUpdateView(AdminStaffRequiredMixin, ListView):
model = SchulverzeichnisTabelle
template_name = 'SCHUK/edit_schulverzeichnis.html'
В url.py
вы делаете запись, чтобы отредактировать пункт:
# app_name/urls.py
from django.urls import path
urlpatterns = [
path('dashboard/', DashboardView.as_view()),
path(
'dashboard/schulverzeichnis/<int:pk>/edit/',
SchulverzeichnisUpdateView.as_view(),
name='edit-schulverzeichnis',
),
]
В вашем шаблоне DashboardView
вы затем ссылаетесь на редактирование для этого вида:
<a href="{% url 'edit-schulverzeichnis' pk=obj.pk %}">edit</a>
с obj
объектом, который вы используете в ListView
. Затем в шаблоне edit_schulverzeichnis.html
вы можете использовать {{ form }}
и отправить POST-запрос к тому же представлению для обновления.
Примечание: Модели обычно не имеют суффикса
.Tabelle
. Модель - это не таблица, она хранится в реляционной базе данных как таблица, но даже тогда она имеет дополнительную логику, такую как валидаторы, менеджеры и т.д.
Примечание: В Django представления, основанные на классах (CBV), часто имеют суффикс
…View
, чтобы избежать столкновения с именами моделей. Поэтому вы можете переименовать класс представления вDashboardView
, вместо.Dashboard
Я не знаю вашу модель, и как она связана с пользователем, но я могу себе представить:
class Dashboard (...):
# any staff here
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['Schulverzeichnis'] = SchulverzeichnisTabelle.objects.filter(author=self.request.user)
return context
Кстати, старайтесь использовать в коде только английский язык. Если вы начнете работать в команде, это знание поможет.