progammist
progammistJan. 2, 2021, 4:44 a.m.

Как создать систему рейтингов

django, rating

Всем привет. Вопрос такой. У меня есть мини-блог и профили пользователей. На странице профилей пользователей я отображаю информацию:

Количество комментариев этого пользователя;
Количество постов этого пользователя;

Я отображаю количество комментариев в пользовательском профиле шаблона следующим образом:

{{user.comments.count}}

Хотелось бы сделать небольшую рейтинговую систему, например:

Если пользователь оставил 10 комментариев и 10 постов - он кот (слово рядом с username, например).
Если 20 - это собака (слово рядом с username, например).
30 - слон и др.

Для этого я хотел бы иметь отдельную таблицу в базе данных, чтобы потом я мог делать выбор по рейтингу пользователей. Это слово я бы хотел выводить потом везде, где упоминается пользователь (например рядом с ником в комментарии)

Как я могу это реализовать? Буду благодарен за любую помощь

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

5
Илья Чичак
  • Jan. 2, 2021, 7:52 p.m.

я бы сделал кастомный queryset, в котором делал бы аннотацию count, а потом исходя из этого делал бы выводы
второй вариант - сделать функцию, которая бы делала count комментов, которые оставил этот пользователь, а потом исходя из этого возвращала бы константу его типов

    progammist
    • Jan. 3, 2021, 8:30 p.m.
    • (edited)

    А как это можно привязать например к закаладкам? Закладки делал по статье

    Попробовал так:

    def user_ratings (request):
        user = request.user
        count_of_posts = user.bookmarkarticle_set.count()
        titles = {
            range(1, 10): 'Кошка',
            range(10, 20): 'Собака',
            range(20, 30): 'Слон'
            # add more titles
        }
        user_title = ''
        for key in titles:
            if count_of_posts in key:
                user_title = titles[key]
        return render(request, 'user.html', {'user': user,
                                             'user_title': user_title})
    

    Но ничего не выводится. Если у вас есть время, не могли бы вы показать - как бы это реализовали вы?

      Илья Чичак
      • Jan. 4, 2021, 3:23 p.m.
      In [1]: def user_rating(user):
         ...:     titles = {
         ...:     range(0, 10): '1',
         ...:     range(10, 20): '2'
         ...:     }
         ...:     for key, name in titles.items():
         ...:         if user.c in key:
         ...:             return name
         ...: 
      
      In [2]: class U:
         ...:     def __init__(self, c):
         ...:         self.c = c
         ...: 
      
      In [3]: user_rating(U(5))
      Out[3]: '1'
      

      у меня вот так получилось

      я бы сделал эту функцию отдельно и сделал бы ранний return - у вас будет перебираться весь словарь titles, хотя нужное значение может быть в самом начале

      а уже в представлении вызывал бы функцию

        progammist
        • Jan. 4, 2021, 8:39 p.m.
        • (edited)

        Спасибо, вроде появляется понимание, а в предатвелнии вызывать функцию - это как (в плане синаксиса) ?)
        И еще, если я захочу привязать эту логику к количеству комментариев пользователя,то где мне указать comment.count ?
        Комментарии вывожу в шаблоне так:

        {{user.comments.count}}
        
          Илья Чичак
          • Jan. 4, 2021, 11:55 p.m.
          • (edited)

          не, вы сейчас про шаблоны
          для шаблонов надо делать тэги (я бы использовал inclusion tag) - https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/#inclusion-tags

          представления - это то, что

          def index_view(request):
              return render(...)
          

          но лучше вообще это не использовать - шаблоны оч медленно работают (если python код загружается в память, то шаблоны при каждом обращении ищутся и обрабатываются с нуля, а работа с файловой системой сильно медленнее, чем работа с оперативой памятью)

          я имел в виду:

           def profile_view(request, ...):
              ...
              user_rating = get_user_rating(user)
              ...
              return render(request, ..., {'user_rating': user_rating, ...})
          

          тоесть, вернуть эту функцию там, где надо

            Comments

            Only authorized users can post comments.
            Please, Log in or Sign up
            Ua

            Qt - Test 001. Signals and slots

            • Result:84points,
            • Rating points4
            Ua

            Qt - Test 001. Signals and slots

            • Result:42points,
            • Rating points-8
            ОК

            Qt - Test 001. Signals and slots

            • Result:47points,
            • Rating points-6
            Last comments
            ИМ
            Игорь МаксимовNov. 22, 2024, 9:51 p.m.
            Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
            Evgenii Legotckoi
            Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
            Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
            A
            ALO1ZEOct. 19, 2024, 5:19 p.m.
            Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
            ИМ
            Игорь МаксимовOct. 5, 2024, 4:51 p.m.
            Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
            d
            dblas5July 5, 2024, 8:02 p.m.
            QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
            Now discuss on the forum
            f
            firstlunoxodFeb. 15, 2025, 1:46 p.m.
            Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
            Дмитрий
            ДмитрийFeb. 3, 2025, 4:24 p.m.
            Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
            NW
            Nayo WaiJan. 30, 2025, 7:22 p.m.
            не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
            n
            nklyJan. 3, 2025, 12:52 p.m.
            Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
            M
            MarselAug. 17, 2023, 12:26 a.m.
            OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

            Follow us in social networks