I have a small problem in creating the correct formula with {if}
in my html file. I would like to have a view for all table which it was not available if the user doesn't search anything.
But in my situation it is always available, and I can not hide it. I will be grateful for any help.
My html file
{% extends 'base.html' %}
{% load widget_tweaks %}
{% block title %}
<hr class="featurette-divider">
<h1><center>Wyszukiwarka firm</center></h1>
<hr class="featurette-divider">
{% endblock %}
{% block content %}
<form method="get">
<div class="well">
<h4 style="margin-top: 1"><center>Wpisz nazwę firmy</center></h4>
<div class="row " >
<div class="form-group form-group-lg " >
<div class="col-sm-12 " >
{{ filter.form.label_tag }}
{% render_field filter.form.name class="form-control" %}
</div>
</div>
<div class="form-group col-sm-8 col-md-6">
{{ filter.form.groups.label_tag }}
</div>
</div>
<button type="submit" class="btn btn-primary btn-block">
<span class="glyphicon glyphicon-search"></span> Search
</button>
</div>
</form>
<table class="table table-bordered">
<thead>
<tr>
<th>Nazwa</th>
<th>Rating</th>
<th>Ilość opinii</th>
<th>Dodatkowe informacje</th>
<th>Miasto</th>
</tr>
</thead>
<tbody>
{% for wine in filter.qs %}
<tr>
<td><h4><a href="{% url 'reviews:wine_detail' wine.id %}">
{{ wine.name }}
</a></h4></td>
<td>{{ wine.average_rating | floatformat }} average rating</td>
<td>{{ wine.review_set.count }} reviews</td>
<td>{{ user.date_joined }}</td>
<td>
{% for group in user.groups.all %}
{{ group }}
{% empty %}
<em class="text-muted">Brak inf. o miescie</em>
{% endfor %}
</td>
</tr>
{% empty %}
<tr>
<td colspan="5">No data</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
My views.py
def review_list(request):
latest_review_list = Review.objects.order_by('-pub_date')[:9]
context = {'latest_review_list':latest_review_list}
return render(request, 'reviews/review_list.html', context)
def review_detail(request, review_id):
review = get_object_or_404(Review, pk=review_id)
return render(request, 'reviews/review_detail.html', {'review': review})
def wine_list(request):
wine_list = Wine.objects.order_by('-name')
context = {'wine_list':wine_list}
return render(request, 'reviews/wine_list.html', context)
def wine_detail(request, wine_id):
wine = get_object_or_404(Wine, pk=wine_id)
form = ReviewForm()
return render(request, 'reviews/wine_detail.html', {'wine': wine, 'form': form})
@login_required
def add_review(request, wine_id):
wine = get_object_or_404(Wine, pk=wine_id)
form = ReviewForm(request.POST)
if form.is_valid():
rating = form.cleaned_data['rating']
comment = form.cleaned_data['comment']
user_name = request.user.username
review = Review()
review.wine = wine
review.user_name = user_name
review.rating = rating
review.comment = comment
review.pub_date = datetime.datetime.now()
review.save()
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse('reviews:wine_detail', args=(wine.id,)))
return render(request, 'reviews/wine_detail.html', {'wine': wine, 'form': form})
def user_review_list(request, username=None):
if not username:
username = request.user.username
latest_review_list = Review.objects.filter(user_name=username).order_by('-pub_date')
context = {'latest_review_list':latest_review_list, 'username':username}
return render(request, 'reviews/user_review_list.html', context)
def search(request):
review_list = Review.objects.all()
review_filter = ReviewFilter(request.GET, queryset=review_list)
return render(request, 'reviews/my_search.html', {'filter': review_filter})
def search_wine(request):
wine_list = Wine.objects.all()
wine_filter = WineFilter(request.GET, queryset=wine_list)
return render(request, 'reviews/my_search_1.html', {'filter': wine_filter})
My filtrs.py
from django.db import models
from .models import Review, Wine
import django_filters
class ReviewFilter(django_filters.FilterSet):
comment = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Review
fields = ['comment', 'wine', 'rating', 'user_name']
class WineFilter(django_filters.FilterSet):
class Meta:
model = Wine
fields = ['name',]
EDIT I think that a good solution the problem can be something like that ( on a simplified example):
{% if a != c %}
{% for wine in filter.qs %}
<li>{{ wine.name }} - {{ wine.get_full_name }}</li>
{% endfor %}
{% else %}
<p>Search for something</p>
{% endif %}
where a = all indexed 'name' in the database and b = all rows in the table (but how can it be calculated)?