user12137867
user12137867

Reputation:

Displaying framework message.error DJANGO

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

Answers (1)

bhaskarc
bhaskarc

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

Related Questions