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)
Вернуться на верх