Показывать параметры фильтра django в зависимости от вошедшего пользователя

Я новичок в Django и пытаюсь показать опции фильтра, которые относятся только к пользователю - например, в моем приложении есть классы Message и Automation с отношением многие:многие, но мой фильтр показывает опцию выбора с автоматизациями, созданными другими пользователями, а не только теми, которые созданы вошедшим пользователем.

Как я могу заставить его показывать только те, которые созданы текущим пользователем?

Вид:

@login_required(login_url='login')
@allowed_users(allowed_roles=['admin', 'customer'], own_account_only=True)
def message_list(request, pk):
    account = Account.objects.get(id=pk)
    messages = account.message_set.all()
    filter = MessageFilter(request.GET, queryset=messages)
    messages = filter.qs
    context = {'account': account,
               'messages': messages, 'filter': filter}
    return render(request, 'messages/message_list.html', context)

Фильтр:

class MessageFilter(django_filters.FilterSet):
    class Meta:
        model = Message  # model we’re building filter for
        fields = '__all__'
        exclude = ['account', 'date_created', 'text', 'subject']

Классы:

class Message(models.Model):
    name = models.CharField(max_length=100)
    subject = models.CharField(max_length=128)
    text = models.TextField()
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    automations = models.ManyToManyField('automations.Automation', blank=True)

    def __str__(self):
        return self.name

class Automation(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=200)
    account = models.ForeignKey(Account, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    messages = models.ManyToManyField(Message, blank=True)

    def __str__(self):
        return self.name

И HTML:

<form method="get" class="filter-form with-ps hide">
  {{filter.form.as_p}}
  <button class="button" type="submit">Search</button>
</form>

Я предполагаю, что мне нужно отредактировать messages, передаваемый в MessageFilter, чтобы как-то исключить автоматизацию, принадлежащую всем пользователям, или как-то сказать MessageFilter, чтобы он показывал только автоматизацию и т.д. текущего вошедшего пользователя?

Спасибо.

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

messages = account.message_set.exclude( something = whatever)

все будет основано на request.user. Однако это будет полностью ограничивать то, что пользователь может видеть, а не только начальное значение по умолчанию того, что пользователь может видеть.

Другой способ - "доктор" request.GET для инициализации фильтра. Вместо

filter = MessageFilter(request.GET, queryset=messages)

do

request_get = request.GET.copy()
# mutate request_get based on contents of request.GET and request.user
...
filter = MessageFilter(request_get, queryset=messages)

request_get является изменяемым, в отличие от request.GET. Вы можете просмотреть его, чтобы узнать, какие фильтры запросил пользователь. При первом просмотре их не будет, и вы можете вставить некоторые подходящие фильтры, назначив соответствующие пары ключ/значение в request_get. Таким образом, пользователь может отменить начальные значения по умолчанию, которые вы выбрали для него.

Вернуться на верх