Reputation:
I am creating an app when a user can search for recipes by inputing some ingredients in search-field.
I would like to do that when search-field is empty or string is empty a user get error.message 'Please put input.' But after i have implemented message.error into views and template it only returns the same page without this informaton 'Please put input.'. Do you know what i made wrong here?
My views:
from django.shortcuts import render
from django.db.models import Q #new
from .models import Recipe
from .models import Ingredient
from django.contrib import messages
from django.shortcuts import redirect
def drink_list(request):
template = "drinks/drink_list.html"
return render(request, template)
def search_results(besos):
query = besos.GET.get('q')
if not query or query == ' ' or query == ' ' or query == ' ':
messages.error(besos, "Please put input")
return redirect('drink_list')
else:
q = Q()
for queries in query.split():
q |= (Q(ingredients__ingredient_name__icontains=queries))
#why it look for 'sok z cytryny' and show as well sok z limonki
results = Recipe.objects.filter(q)
template = "drinks/search_results.html"
context = {
'results' : results,
}
return render(besos, template, context)
My template search_results:
{% if results %}
{% for drink in results %}
<div>
<p>{{ drink.recipe_name }}</p>
<p>Preparation: {{ drink.preparation }}</p>
<p>Ingredients:
{% for ingredient in drink.ingredients.all %}
{{ingredient.ingredient_name}}{% if not forloop.last %},{% endif %}
{% endfor %}
</p>
</div>
{% endfor %}
{% elif messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% else %}
<div>Such ingredients do not exist</div>
{% endif %}
Upvotes: 0
Views: 91
Reputation: 9521
If there is no query term , you are currently redirecting to:
return redirect('drink_list')
but you are not passing the message on to the drink_list
view.
In case of redirect, you can pass the message string as argument
return redirect('{}?message=Please put input'.format(reverse('drink_list)))
Then your drink_list
template must include:
<ul class="messages">
<li>{{ message }}</li>
</ul>
You need to further modify your drink_list
function to get the message argument:
def drink_list(request):
template = "drinks/drink_list.html"
message = request.GET.get('message', ''))
return render(request, template, message=message)
And finally your url must include the optional message argument :
path('drink_list/', views.drink_list,name='drink_list'),
Upvotes: 1