В проекте предусмотрены различные сценарии для пользователей в разных разделах.
В соответствии с определенными сценариями меняются пункты меню пользователя.
Первоначально в профиле пользователя было предусмотрено поле
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
Нет комментариев