Каков наилучший подход к наследованию классов и отслеживанию пользовательских представлений в Django?
Я пытаюсь понять, как правильно использовать наследование классов в Django. Одна вещь, с которой я борюсь, - это создание пользовательского представления, которое отслеживает, что делают пользователи. Главное, на чем я застрял, - это класс, который я создал:
class Tracker:
activity = None
def action(self, *login_user: User, whom: User, is_current: bool) -> None:
"""Create Action model"""
...
def visitor(self, login_user: User, whom: User) -> None:
"""create a Visitor model"""
...
@validate_view_inheritance
def tracker(self, login_user: User, whom: User):
url_user = self.kwargs.get("username")
login_user: User = self.request.user
is_current_user = login_user.username == url_user
self.action(login_user=login_user, whom=whom, is_current=is_current_user)
self.visitor(whom, login_user)
Вы можете заметить, что я пытаюсь получить информацию о request и kward, но они не являются частью самого класса. Похоже, что это работает только тогда, когда я наследую этот класс с определенными Views. Это правильный способ сделать это? Кроме того, я использую пользовательский декоратор, который проверяет, является ли этот класс подклассом View. Если нет, он выдает ошибку ImproperlyConfigured
.
В будущем я хочу использовать этот класс для создания пользовательских представлений, например, таких:
class CustomDetailView(DetailView, EpulsTracker):
activity = ActionType.PROFILE
def get(self, request, *args, **kwargs):
"""Overrides the get method."""
self.object = self.get_object()
context = self.get_context_data(object=self.object)
# Track user action
self.tracker()
return self.render_to_response(context)
Я планирую добавить подобное отслеживание в другие представления, такие как ListView
и DeleteView
..., где я буду использовать self.tracker()
в методе get
. Таким образом, я смогу легко использовать его в своем проекте:
class ExampleView(LoginRequiredMixin, CustomDetailView):
model = Profile
template_name = "sample.html"
activity = ActionType.PROFILE
Что вы думаете? Является ли наследование классов таким образом хорошим способом или есть лучший подход?