J'essaie de filtrer mes articles par titre exact en cliquant sur le lien avec le titre. J'ai réussi à afficher les titres, mais lorsque je clique sur l'un d'eux, j'obtiens une erreur : Reverse for 'category_search' with arguments '('',)' not found. 1 pattern(s) tried: ['search/(?P<category_id>[0-9]+)$'] , qui pointe vers la fonction TitleView.

Views.py- Juste pour clarifier certaines choses, category_view est utilisé pour filtrer les éléments par leur catégorie, qui se trouve sur une page différente, mais les résultats sont affichés sur search.html

def category_view(request, category_id):
  item_list = Item.objects.filter(category__pk=category_id)
  category = Category.objects.get(pk=category_id)

  return render(request, "search.html", {'item_list': item_list, 'category': category})

def TitleView(request, title):
  item_list = Item.objects.filter(title__iexact=title)
  return render(request, "search.html", {'item_list': item_list})

def SearchView(request, category_id=None, title=None):
  if category_id:
      category = Category.objects.get(pk=category_id)
      item_list = Item.objects.filter(category__id=category_id)
  else:
      item_list = Item.objects.all()

  query = request.GET.get('q')
  if query:
      item_list = item_list.filter(title__icontains=query)

  price_from = request.GET.get('price_from')
  price_to = request.GET.get('price_to')

  item_list = item_list.annotate(
      current_price=Coalesce('discount_price', 'price'))

  if price_from:
      item_list = item_list.filter(current_price__gte=price_from)

  if price_to:
      item_list = item_list.filter(current_price__lte=price_to)

  context = {
      'item_list': item_list,
      'category': category,
  }
  return render(request, "search.html", context)

Modèle html:

    <div class="offset-md-1 col-md-2">
    <h2>Content Filter</h2> <br>
    <form method="GET" action="{% url 'core:category_search' category.id %}">
        <h5>Search</h5>
        <div class="form-row">
            <div class="form-group col-8">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="q"
                        placeholder="Brand..">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <h5>Price from</h5>
        <div class="form-row">
            <div class="form-group col-5">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="price_from"
                        placeholder="Price from" value="{{request.GET.price_from}}">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <h5>Price to</h5>
        <div class="form-row">
            <div class="form-group col-5">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="price_to"
                        placeholder="Price to" value="{{request.GET.price_to}}">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <div class="form-row">
            <button type="submit" class="btn btn-outline-primary btn-md">Search</button>
        </div>
    </form>
</div>
<ul>
    {% for item in item_list %}
    <li>
        <a href="{% url 'core:title_search' title=item.title  %}">
            {{ item.title }}
        </a>
    </li>
    {% endfor %}
</ul>

URL:

  path('search/', SearchView, name='search'),
  path('search/<int:category_id>', SearchView, name='category_search'),
  path('search/<title>', TitleView, name='title_search'),
  path('bike-category/<category_id>', category_view, name='category'),
0
Menor 20 févr. 2020 à 02:21

1 réponse

Meilleure réponse

Vous devez fournir la catégorie dans le contexte du modèle ou utiliser un modèle différent. Étant donné que vous retournez une liste, je ne sais pas exactement comment vous allez en extraire une catégorie.

Si vous vouliez qu'il s'agisse d'un lien direct vers chacun des éléments, je vous recommande de ne pas utiliser title comme propriété de recherche. Au lieu de cela, ajoutez un SlugField à votre modèle et marquez-le comme unique. Ensuite, utilisez-le dans votre URL :

path('search/<slug:slug>/', item_view, name='item_view'),

Alors votre point de vue serait:

def item_view(request, slug):
  item = Item.objects.select_related('category').get(slug__iexact=slug)
  return render(request, "search.html", {
    'item_list': [item],
    'category': item.category
  })

Éditer:

def SearchView(request, category_id=None):
    if category_id:
      category = Category.objects.get(pk=category_id)
      item_list = Item.objects.filter(category__id=category_id)
  else:
      item_list = Item.objects.all()
  title = request.GET.get('title')
  if title:
      item_list = item_list.filter(title__iexact=title)
  else:
     query = request.GET.get('q')
      if query:
          item_list = item_list.filter(title__icontains=query)

      price_from = request.GET.get('price_from')
      price_to = request.GET.get('price_to')

      item_list = item_list.annotate(
          current_price=Coalesce('discount_price', 'price'))

      if price_from:
          item_list = item_list.filter(current_price__gte=price_from)

      if price_to:
          item_list = item_list.filter(current_price__lte=price_to)

  context = {
      'item_list': item_list,
      'category': category,
  }
  return render(request, "search.html", context)

URL:

 path('search/', SearchView, name='search'),
  path('search/<int:category_id>', SearchView, name='category_search'),
  path('bike-category/<int:category_id>', category_view, name='category'),

Modèle:

    <div class="offset-md-1 col-md-2">
    <h2>Content Filter</h2> <br>
    <form method="GET" action="{% if category %}{% url 'core:category_search' category.id %}{% else %}{% url 'core:search' %}{% endif %}">
        <h5>Search</h5>
        <div class="form-row">
            <div class="form-group col-8">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="q"
                        placeholder="Brand..">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <h5>Price from</h5>
        <div class="form-row">
            <div class="form-group col-5">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="price_from"
                        placeholder="Price from" value="{{request.GET.price_from}}">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <h5>Price to</h5>
        <div class="form-row">
            <div class="form-group col-5">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="price_to"
                        placeholder="Price to" value="{{request.GET.price_to}}">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
        <div class="form-row">
            <button type="submit" class="btn btn-outline-primary btn-md">Search</button>
        </div>
    </form>
</div>
<ul>
    {% for item in item_list %}
    <li>
        <a href="{% if category %}{% url 'core:category_search' category.id %}{% else %}{% url 'core:search' %}{% endif %}?title={{item.title}}">
            {{ item.title }}
        </a>
    </li>
    {% endfor %}
</ul>

Je pense avoir géré correctement l'attribut action du formulaire et les attributs href des liens. Vous devrez peut-être les nettoyer selon votre situation.

1
schillingt 20 févr. 2020 à 00:07