Написать личное письмо автору статьи
Меню для пользователей
Меню для пользователей

В проекте предусмотрены различные сценарии для пользователей в разных разделах.

В соответствии с определенными сценариями меняются пункты меню пользователя.

Первоначально в профиле пользователя было предусмотрено поле 

section_author = models.ManyToManyField('sections', verbose_name='Автор в разделах', related_name='section_author', symmetrical=False, blank=True, null=True),

но среди пользователей будет ограниченное количество авторов и для сокращения количества пустых полей и исключения просмотра полей по всей базе пользователей была создана отдельная таблица для авторов.

 user = models.OneToOneField(Profile, verbose_name='Профиль Автора', on_delete=models.CASCADE)
  
   slug = models.SlugField(verbose_name='Персональная ссылка', max_length=255, blank=True, unique=True)

   section_author = models.ManyToManyField('sections', verbose_name='Автор в разделах', related_name='section_profiles_author', symmetrical=False, blank=True, null=True).

В представлениях для проверки прав пользователя для конкретной страницы прописывался код для выборки из таблицы авторов для авторизованного пользователя:

  user = auth.get_user(request) получаем данные авторизованного пользователя

sections_author = ProfileAuthor.objects.all() - Выбираем всю таблицу
   author = sections_author.filter(user=Profile.objects.get(user__username=user)) - из таблицы выбираем данные для авторизованного пользователя

 context = {

              'verbose_name': ProgectConfig.verbose_name, - переменная для идентификации приложения
              'section_site_profile': author} - данные передаю в html.

В html прописываю код для проверки прав:

  {% for profile in section_site_profile %}  цикл по выборке записей для авторизованного пользователя
               {% for sections in profile.section_author.all %} цикл по полю данных ManyToManyField
                     {% if verbose_name == sections.section %} проверка на совпадение
                       <a id="user_action" class="dropdown-item" href="{% url 'articles_create_progect' %}">Добавить статью</a><!--метка для добавления подпунктов по статусу пользователя-->
                     {% endif %}
               {% endfor %}
             {% endfor %}

Но данный вариант показался неэффективным.

Первое, что сделал это из представлений вынес повторяющийся код в файл mixins.py

    def get_context_data(self, **kwargs):  
       user = auth.get_user(self.request)
       user_auth = self.request.user
       
       currentUrl = self.request.build_absolute_uri() # получаю адрес страницы
       context = super().get_context_data( **kwargs)
       sections_author = ProfileAuthor.objects.all()# сделал выборку модели авторов
       author = sections_author.filter(user=Profile.objects.get(user__username=user)) # выбрал данные пользователя
       age = author.filter(section_author__section='Семейное фото').exists() # в поле разделов проверил наличие совпадения.
       # Проверяем, является ли поле ImageField пустым
       count=10
      
       context['surnames'] = Surname.objects.all().order_by('title')
      
       context['latest_photo']  = Photo.objects.all().filter(fixed=True).order_by('-time_create')[:count]
       context['section_site_profile'] = author
       context['verbose_name'] = 'Семейное фото'
       context['age'] = age
       context['currentUrl'] = currentUrl
       return context

В этот же код внес корректировку, что бы не выбирать все данные для пользователя о разрешениях на написание материалов для приложения, а сделал проверку на совпадение по наименованию раздела. Функция exists()  в переменной age возвращает True или False.

Это позволило в html заменить циклы на :

    {% if age == True %}
                            <ul>
                               
                                
                            </ul>
                            {% else %} .

Так выглядит код лучше, но остался вопрос с частью кода

       user = auth.get_user(self.request)
       sections_author = ProfileAuthor.objects.all()# сделал выборку модели авторов
       author = sections_author.filter(user=Profile.objects.filter(user__username=user)) # выбрал данные пользователя
       age = author.filter(section_author__section='Семейное фото').exists() # в поле разделов проверил наличие совпадения.

 

Не понятно почему не получается записать его в одну строку.

Попробую в дальнейшем.

Категория: Администрирование / Добавил: zabarinap / 6 февраля 2025 г. 14:59
/ Просмотры: 37/ Просмотры за сегодня: 1
Комментарии

Нет комментариев

Форма добавления комментария доступна только авторизованному пользователю.
Похожие статьи
Последние комментарии в разделе Проект
  • Комментариев нет.