Каков наилучший подход к наследованию классов и отслеживанию пользовательских представлений в 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

Что вы думаете? Является ли наследование классов таким образом хорошим способом или есть лучший подход?

Вернуться на верх