django вызывать .annotate контекстных процессоров в DetailView - PullRequest
0 голосов
/ 11 апреля 2020

Мой проект зависит от предоставления пользователям баллов за то, что они делают (публиковать, комментировать, например, избранные, ....)

Я создал процессор контекста, чтобы использовать некоторые вычисления в нескольких шаблонах.

Моя проблема в том, что я не могу вызвать эти контекстные процессоры в шаблоне без для l oop

Models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
    favourite = models.ManyToManyField(User, related_name='favourite', blank=True)

class Comment(models.Model):
    user = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name='commenter')
    post = models.ForeignKey(
        Post, on_delete=models.CASCADE, related_name='comments')

class Profile(models.Model):
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='profile')

views.py

class UserDetailView(DetailView):
    template_name = 'user/user-details.html'
    queryset = User.objects.all()

    def get_object(self):
        return get_object_or_404(
            User, username__iexact=self.kwargs.get("username")
        )

settings.py

'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'common.context_processors.user_counters',
            ],

шаблонов. html

<ul class="dynamic-tabs-list">
    <li data-content=".content-points">Points
        <span class="badge badge-light">{{ user.total_score }}</span></li>
</ul>

context_processors.py

def user_counters(request):
        user_qs = User.objects\
            .annotate(
                user_posts_count=Count('posts', distinct=True),
                user_posts_score=F('user_posts_count') * 10,)\
            .annotate(
                user_comments_count=Count('commenter', distinct=True),
                user_comments_score=F('user_comments_count') * 10,)\
            .annotate(
                user_favourites_count=Count('favourite', distinct=True),
                user_favourite_score=F('user_favourites_count') * 10,) \
            .annotate(
                user_likes_count=Count('likes', distinct=True),
                user_likes_score=F('user_likes_count') * 10, ) \
            .annotate(
                total_score=F('user_posts_score')+F('user_comments_score')+F('user_favourite_score')+F('user_likes_score')
                    )
        context = {
            'user_qs': user_qs,
        }
        return context

urls.py

path('profile/<username>/', UserDetailView.as_view(), name='user-detail'),

Любая помощь, пожалуйста?

Заранее спасибо

1 Ответ

0 голосов
/ 11 апреля 2020

В вашей функции user_counters пользовательские объекты не берут один объект, вместо этого требуются целые пользователи, которых вы должны использовать для l oop.

Я бы предложил передать эту функцию DetailView:

Вместо

class UserDetailView(DetailView):
template_name = 'user/user-details.html'
queryset = User.objects.all()

def get_object(self):
    return get_object_or_404(
        User, username__iexact=self.kwargs.get("username")
    )

Измените его на:

class UserDetailView(DetailView):
   template_name = 'user/user-details.html'
   queryset = User.objects.all()

   def get_object(self):
       user_detail = get_object_or_404(
        User, username__iexact=self.kwargs.get("username")
       )

       return user_counters(user_detail)

И context_processors.py

def user_counters(user):
    user_qs = User.objects.get(username=user)
        .annotate(
            user_posts_count=Count('posts', distinct=True),
            user_posts_score=F('user_posts_count') * 10,)
        .annotate(
            user_comments_count=Count('commenter', distinct=True),
            user_comments_score=F('user_comments_count') * 10,)
        .annotate(
            user_favourites_count=Count('favourite', distinct=True),
            user_favourite_score=F('user_favourites_count') * 10,)
        .annotate(
            user_likes_count=Count('likes', distinct=True),
            user_likes_score=F('user_likes_count') * 10, )
        .annotate(
      total_score=F('user_posts_score')+F('user_comments_score')+F('user_favourite_score')+F('user_likes_score')
                )
    context = {
        'user_qs': user_qs,
    }
    return context

Попробуйте это, и пусть я знаю, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...