Почему django queryset позволяет мне искать пользователей только по внешнему ключу (Number), а не по имени пользователя?
<class RequestSearchUser(LoginRequiredMixin, ListView):
model = FriendList
form_class = SearchUserForm
template_name = 'wallet/request_search_user_form.html'
def get_queryset(self):
try:
username = self.kwargs['search_user']
except:
username = ''
if username != '':
object_list = self.model.objects.filter(user=username)
else:
object_list = self.model.objects.all()
return object_list
def get_context_data(self, **kwargs):
context = super(RequestSearchUser, self).get_context_data(**kwargs)
query = self.request.GET.get("search_user")
context['user'] = self.request.user
if query:
queryset = (Q(user=query))
search_user = FriendList.objects.filter(queryset)
if not search_user:
messages.error(self.request, 'No user found.')
else:
search_user = []
context['search_user'] = search_user
context['nbar'] = 'request'
return context
Вот моя поисковая форма.py
class SearchUserForm(forms.ModelForm):
class Meta:
model = User
fields = ('username',)
def clean_username(self):
username = self.cleaned_data['username'].strip()
return username
Здесь находится Html форма
<div class="blog_details">
<h2>Request Money</h2><hr>
<form class="form-contact contact_form" action="{% url 'wallet:request' %}" method="get" novalidate="novalidate">
<div class="row">
<div class="col-12">
{% if messages %}
{% for message in messages %}
<div class="alert alert-danger" role="alert">
{{ message }}
</div>
{% endfor %}
{% endif %}
</div>
<div class="col-12">
{% for search_user in search_user %}
{% if search_user == request.user %}
<div class="alert alert-danger" role="alert">
Cannot input your username.
</div>
{% else %}
<meta http-equiv="refresh" content="0; url={% url 'wallet:request_money' search_user.id %}" />
{% endif %}
{% endfor %}
</div>
<div class="col-12">
<div class="form-group">
<input class="form-control" name="search_user" id="search_user" type="text" maxlength="45"
onfocus="this.placeholder = ''" onblur="this.placeholder = 'Username'" placeholder="Username" required/>
</div>
</div>
</div>
<div class="form-group mt-3">
<button type="submit" class="button button-contactForm boxed-btn">Search </button>
</div>
</form>
</div>
</article>
Ошибка здесь
object_list = self.model.objects.filter(user=username)
и здесь
queryset = (Q(user=query))
Если вы храните имя пользователя в поле username, вы должны фильтровать по user__username
object_list = self.model.objects.filter(user__username=username)
queryset = (Q(user__username=query))
Это хорошо описано здесь Много к одному
Вы можете использовать contains, тогда ваш запрос будет выглядеть следующим образом
if query:
queryset = (
Q(user__username__contains=query)|
Q(user__first_name__contains=query)|
Q(user__email__contains=query)
)
search_user = FriendList.objects.filter(queryset)
if not search_user:
messages.error(self.request, 'No user found.')