ホーム>source

私はDjangoフレームワークが初めてで、実践プロジェクトとして、Djangoを使用してeコマースWebサイトを構築しようとしています。検索ページにクラスベースのビューがあります。特定のクエリのクエリを取得するビューを作成しました。

views.py

class SearchProductView(ListView):  
    template_name = "template.html"
    queryset = Product.objects.filter(title__icontains='book')
    print(queryset)

検索クエリを動的に取得する関数を作成する方法を知りたいです。例: book を検索する場合 、それから私の queryset   book に関するすべてのものを含める必要があります  そして、 car を検索した場合 、それから car に関するすべてのものを取得する必要があります 。

template.html

{% extends "base.html" %}
{% block content %} 
<div class='row'>
    {% for object in object_list %}
    <div class='col'>
        {{ forloop.counter }}
        {% include 'products/snippets/card.html' with instance=object %}
    </div>
    {% endfor %}
</div>  
{% endblock %}

urls.py

from django.urls import path
from . import views
from .views import SearchProductView
app_name = 'search'
urlpatterns = [   
    path('', SearchProductView.as_view(), name='search_page'),
]

あなたの答え
  • 解決した方法 # 1

    get_queryset を定義する必要があります  クラスレベルの queryset ではなくメソッド  属性。これは、クエリ文字列パラメータを使用して、クエリセットを動的にフィルタリングできます。

    検索フォームを表示していないか、パラメーターが何であるかを言っていないが、それが q という名前のGETパラメーターを送信すると仮定する 、あなたがするだろう:

    def get_queryset(self):
        return Product.objects.filter(title__icontains=self.request.GET['q'])
    
    

  • 解決した方法 # 2

    上記の答えはうまくいきますが、より良い解決策は次のようになると思います。

    models.py

    class Category(models.Model):
        title = models.CharField(...)
    
    class Product(models.Model):
        ...
        category = models.ForeignKey(Category)
    
    

    views.py

    from django.db.models import Q
    def get_queryset(self):
        querystr = self.request.GET['q']
        Product.objects.filter(
            Q(title__icontains=querystr) | Q(category__title__icontains=querystr)
        )
    
    

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ regex - それらが互いに適切なサブセットであり、これらの条件を満たすような言語はありますか