2017-01-07 20 views
0

最近私はDjango Webアプリケーションの検索機能を実装しました。しかし、私はコードの動作を完全に理解していません。あなたはどのように "get_queryset" & "get_contest_data"(views.py)が一緒に働くんこのDjango検索機能の理解

  • を何が起こっているかを説明し、具体的;:ていただけますか?
  • 検索リクエスト(テンプレートから)が「get_queryset」に行く方法を知っていますか?
  • 返品期限は何ですか?

ビュー:

from django.db.models import Q 

class ProductListView(ListView): 
    model = Product 
    queryset = Product.objects.all() 

def get_context_data(self, *args, **kwargs): 
    context = super(ProductListView, self).get_context_data(*args, **kwargs) 
    context["now"] = timezone.now() 
    context["query"] = self.request.GET.get("q") #None 
    return context 

def get_queryset(self, *args, **kwargs): 
    qs = super(ProductListView, self).get_queryset(*args, **kwargs) 
    query = self.request.GET.get("q") 
    if query: 
     qs = self.model.objects.filter(
      Q(title__icontains=query) | 
      Q(description__icontains=query) 
      ) 
     try: 
      qs2 = self.model.objects.filter(
       Q(price=query) 
      ) 
      qs = (qs | qs2).distinct() 
     except: 
      pass 
    return qs 

テンプレート

<form class="navbar-form navbar-left" method="GET" role="search" action='{% url "products" %}'> 
<div class="form-group"> 
<input type="text" class="form-control" placeholder="Search" name="q"> 
</div> 
</form> 
+0

で使用されるクエリセットであることをそのクエリセットを返すあなたの 'ProductListView'はLi'のサブクラスであることを確認すること

  • QS2にクエリセットとしてそれを保存しますstView'は 'BaseListView'のサブクラスで' get'メソッドを持っています。この 'get'はGET要求の場合に呼び出され、' get_queryset'と 'get_context_data'を呼び出します。 https://github.com/django/django/blob/master/django/views/generic/list.py – allcaps

  • +0

    とdocs:https://docs.djangoproject.com/en/1.10/topics/class-basedを参照してください。 -views/intro /#using-class-based-views – allcaps

    答えて

    1

    テンプレートが(例えばwww.example.com/products?q=search_term)のparam "Q" で規定されたURLにアクセスし、バックエンドにGETリクエストを送信するためにはDjangoに指示します

    DjangoはurlとGET httpメソッドをProductListViewクラスに一致させます。ここでqはパラメータとして

    ListViewは、コード内で拡張したself.get_context_data()というメソッドのコンテキストを設定します。BaseListViewから継承します。 BaseListViewMultipleObjectMixinから継承され、self.get_queryset()メソッドも実装されています。

    短いCBV(クラスベースビュー)には、hereという異なるメソッドを定義する継承ネットワークがあります。この継承チェーンのおかげで、多くのメソッドが隠されているので、ドキュメントを読んだり、Djangoのソースコードを調べて何が起きているのかを正確に把握する必要があります。

    return qsについては、qsは拡張get_queryset()メソッドで返すクエリセットです。

    • あなたは、Qの価格を持っているすべてのモデルのために
    • 適量でのフィルタリングのタイトルや説明にqの値を持つすべてのモデルの値q
    • フィルタリングを取り、クエリセットとしてそれを保存しますそして、クエリセット適量とQS2を組み合わせると、各レコードが一意である、そしてProductListView
    +0

    CBVと正確な方法を引用してくれてありがとう。私はここから後方に働くことができます! – toiteam