Исключить пользователя экземпляра из автозаполнения Django
Я пытаюсь сделать 3 вещи. 1) исключить пользователя экземпляра из выпадающего списка автозаполнения django, 2) ограничить выбор этого пользователя (в бэкэнде) и 3) настроить сообщение проверки, если выбран этот пользователь. На данный момент у меня есть #2, который, кажется, работает, но я не могу понять, как изменить сообщение об ошибке проверки и как исключить его из выпадающего списка все вместе. Вот мой код:
forms.py
class UserSurveyQueueForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['queue'].queryset = User.objects.all().exclude(pk=user)
class Meta:
model = UserSurveyQueue
fields = ('queue',)
widgets = {
'queue': autocomplete.ModelSelect2Multiple(
url='user-autocomplete',
),
}
views.py
class UserAutocomplete(autocomplete.Select2QuerySetView):
def get_queryset(self):
if not self.request.user.is_authenticated:
return User.objects.none()
# Here is where I want to remove the instance user from the list of available options
qs = User.objects.all()
if self.q:
qs = qs.filter(username__icontains=self.q)
return qs
def set_user_queue(request, username):
u = get_object_or_404(User, username=username)
employee = Employees.objects.filter(employee_id=u.id)
# Get current user's queue to display as instance
queue_exists = UserSurveyQueue.objects.filter(user=u)
if not queue_exists:
queue = None
else:
queue = queue_exists.get(user=u)
if request.method == "POST":
form = UserSurveyQueueForm(request.POST, instance=queue, user=u.id)
if form.is_valid():
form.instance.user = u
form.save()
return HttpResponseRedirect(reverse('home'))
else:
form = UserSurveyQueueForm(instance=queue, user=u.id)
return render(request, 'surveys/set_user_queue.html', {'form': form})
models.py
class UserSurveyQueue(models.Model):
user = models.OneToOneField(
User,
on_delete=models.CASCADE
)
queue = models.ManyToManyField(
User,
related_name='survey_queue',
)
class Meta:
verbose_name = ('Survey Queue')
verbose_name_plural = ('Survey Queues')
def current_queue(self):
return ", ".join([str(q.username) for q in self.queue.all()])
def __str__(self):
return self.user.username
1 ответ
Вы пытались использовать exclude(pk = instance.user) в наборе запросов all()?