Django: Лучший способ отображения экземпляров модели на основе авторизации
< <class Item(models.Model):
creator= models.ForeignKey(User,null=True, on_delete=SET_NULL)
title = models.CharField(max_length=200)
private = models.BooleanField(null=False, blank=True, default=False)
<
def topics(request):
items=Item.objects.all()
context={'items' : items}
return render(request, 'items.html', context)
views.py
main.html
{% for item in items %}
<div>
<p>{{item.title}}</p>
</div>
{% endfor %}
Вопрос: Если 'private' равно true, я хочу пропустить этот пункт, если пользователь не является сотрудником. Таким образом, я могу разделить элементы на основе этого булева значения. Какой способ рекомендуется/лучший способ сделать это? Я не хочу использовать оператор if/else в html, а затем повторять код. Это становится беспорядочным по мере роста проекта.
Заранее спасибо!
Я не уверен, что есть какие-то общие подходы для представлений, основанных на функциях.
В DRF вы можете создать пользовательский Filter и включить его в ваши ViewSets Это выглядит следующим образом
class BaseKeyFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
if not request.user.is_staff:
queryset = queryset.filter(private=False)
return queryset
class ItemViewSet(ModelViewSet):
queryset = Item.objects.all()
serialiser = ItemSerializer
filter_backends = [BaseKeyFilter]
При вашем подходе вы можете функционировать следующим образом
def filter_private(request, queryset):
if not request.user.is_staff:
queryset = queryset.filter(private=False)
return queryset
И использовать его следующим образом
def topics(request):
items=Item.objects.all()
items=filter_private(request, items)
context={'items' : items}
return render(request, 'items.html', context)