Показывать параметры фильтра 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. Таким образом, пользователь может отменить начальные значения по умолчанию, которые вы выбрали для него.