Как сделать так, чтобы форма поиска в django не была пустой
У меня есть приложение для блога, и я хочу, чтобы когда пользователь переходит в /search, он мог искать и фильтровать блоги по автору, названию или тегам блога. Я уже включил Django-filter и он работает, вполне нормально, но когда пользователь не вводит значение и нажимает кнопку поиска, он просто показывает все элементы в базе данных, а я не хочу этого. Я хочу, чтобы они получали флэш-сообщение, говорящее, что им нужно ввести хотя бы элемент. Вот как выглядит мой код
views.py
def search(request):
form = SearchForm()
context = {
'form': form
}
return render(request, 'blog/search.html', context)
def searchResults(request):
blogs = BlogPost.objects.all()
blog_filter = BlogPostFilter(request.GET, queryset=blogs)
blogs = blog_filter.qs
for item in request.GET:
if request.GET[item] == '':
print('sorry')
context = {
'blogs': blogs,
}
return render(request, 'blog/search_results.html', context)
forms.py
class SearchForm(ModelForm):
author = forms.ModelChoiceField(
queryset=UserProfile.objects.all(),
label='',
required=False,
)
title = forms.CharField(
label="",
required=False,
widget=forms.TextInput(attrs={
'placeholder': 'Title',
'class': 'form-control'})
)
short_description = forms.CharField(
label="",
required=False,
widget=forms.TextInput(attrs={
'placeholder': 'Short description',
'class': 'form-control'})
)
category = forms.ModelChoiceField(
queryset=Category.objects.all(),
label='',
required=False,
)
class Meta:
model = BlogPost
fields = '__all__'
exclude = ['likes', 'related_image', 'date_added', 'content']
filters.py
class BlogPostFilter(django_filters.FilterSet):
title = CharFilter(field_name='title', lookup_expr='icontains')
content = CharFilter(field_name='content', lookup_expr='icontains')
class Meta:
model = BlogPost
fields = '__all__'
exclude = ['likes', 'related_image', 'date_added']
Я хочу иметь возможность проверить количество данных GET, которое должно быть не менее 1.
Спасибо за ваш вклад!
Вы можете предотвратить передачу пустого запроса и показать сообщение пользователю, например :-
from django.contrib import messages
def searchResults(request):
blogs = BlogPost.objects.all()
blog_filter = BlogPostFilter(request.GET, queryset=blogs)
blogs = ''
for item in request.GET:
# changed here
if item:
blogs = blog_filter.qs # show results
else:
messages.error(request, 'Type Something')
context = {
'blogs': blogs,
}
return render(request, 'blog/search_results.html', context)
И в файле base.html
{% if messages %}
{% for message in messages %}
{% if message.tags == 'error' %}
<div class="alert alert-danger">{{message|safe}}</div>
{% else %}
<div class="alert alert-{{message.tags}}">{{message|safe}}</div>
{% endif %}
{% endfor %}
{% endif %}
Примечание :- Не забудьте импортировать сообщения в views.py, а также поместить утверждение messages в base.html
.