2017-06-05 2 views
1

Ich bin 2 Monate in Python-Django und ich habe nicht die volle Erfahrung, um mit meinem was ich machen möchte weitermachen.Erstellen Django Filter in einem Bootstrap Dropdown auf der Grundlage der django-admin erstellt Kategorien

Ich mag ein Filter oder ein Dropdown-Filter erstellen, dass jemand aus der for-Schleife gemacht Kategorien in der Dropdown- nach Kategorien zu filtern oder suchen Sie wählen können. Ich schaffte es eine vollständige Suche mit Haystack mit Wusch zu erstellen (Sie können meine Heuhaufen suchen here und suchen Sie testen mit Kategorie Marketing genannt)

Kann jemand mehr Licht auf, wie ich meine Liste filtern basierend auf Kategorien in einer Schleife Dropdown-Liste? Bin wirklich verwirrt.

Hier ist der Code meiner Arbeit Heuhaufen suchen

search_indexes.py

import datetime 
from haystack import indexes 
from haystack.query import EmptySearchQuerySet 
from .models import Mentor 
from .models import * 


class MentorIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    author1 = indexes.EdgeNgramField(model_attr='first_name') 
    author2 = indexes.EdgeNgramField(model_attr='last_name') 
    author3 = indexes.EdgeNgramField(model_attr='category') 
    author4 = indexes.EdgeNgramField(model_attr='email') 
    author5 = indexes.EdgeNgramField(model_attr='location') 

    def get_model(self): 
     return Mentor 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

home.html

<form method="get" action="/search/" class="navbar-form"> 
    <div class="form-group" style="display:inline;"> 
     <div class="input-group" style="display:table;"> 
      <input class="form-control" name="q" placeholder="Search Mentors Here. You can search by Location, Email, Name, e.t.c." autocomplete="off" autofocus="autofocus" type="text"> 
      <span class="input-group-btn" style="width:1%;"> 
       <button class="btn btn-danger" type="submit"> 
        <span class=" glyphicon glyphicon-search"></span> 
       </button> 
      </span> 
     </div> 
    </div> 
</form> 

App-URL Config (url.py)

from django.conf.urls import include, url 
from mentoring_application.views import profile 


urlpatterns = [ 
    url(r'^profile/(?P<pk>\d+)/$', profile, {}, name='mentor-profile'), 
] 

Projekt url Config (url.py)

from django.conf import settings 
from django.conf.urls import url, include 
from django.conf.urls.static import static 
from django.contrib import admin 
from mentoring_application.views import HomeView, profile 


admin.autodiscover() 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^$', HomeView.as_view()), 
    url(r'^mentor/', include('mentoring_application.urls', namespace='mentor')), 
    url(r'^search/', include('haystack.urls')) 
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

views.py

from django.http import HttpResponse, HttpResponseRedirect 
from django.shortcuts import render 
from django.views import View 
from .models import * 
from .models import Mentor 
from django.shortcuts import render, get_object_or_404 


# Create your views here. 


class HomeView(View): 
    # @staticmethod 
    def get(self, request, *args, **kwargs): 
     mentors = Mentor.objects.all() 
     return render(request, "mentoring_application/home.html", {"mentors": mentors}) 


def profile(request, pk, template='mentoring_application/profile.html'): 
    mentor = get_object_or_404(Mentor, pk=pk) # pk is primary key, so url will be site.com/profile/3 
    context = {'mentor': mentor} 
    return render(request, template, context) 

Für mehr Klarheit, Dieses Bild zeigt einen Kategoriefilter Mache ich gerne.

the picture here

+0

Was ist die Ansichtsmethode, die die Vorlagedaten sendet? Kannst du das posten? –

+0

@TimS. Ich bin mir nicht sicher, ob ich deine Frage verstehe, aber ich habe ein Update wie gewünscht gemacht. Allerdings möchte ich einen Filter nach Kategorie erstellen. –

+0

Normalerweise funktioniert Ihre Ansicht so, dass das Objekt basierend auf Ihren Filterkriterien erstellt wird. Anschließend wird das gefilterte Objekt/das abgefragte Objekt an die Vorlage gesendet, die als Dropdown-Liste gerendert werden soll. Ich habe dies vorher nicht speziell gemacht, aber es ist die Aufgabe der Ansicht, die Daten zum Rendern an die Vorlage zu senden. –

Antwort

0

Gemäß dem von @TimS gegeben Kommentar und einige andere hilft aus einer anderen Gemeinde, schrieb ich eine Lösung nach Kategorien zu filtern und es funktioniert.

Unten finden Sie die Hack, der seine Arbeit gemacht:

home.html

Dies ist die geschlungenen Dropdown aus Kategorien Tabelle. Ich habe ein Namenselement namens category-filter für die Auswahl der Kategorien auf meiner Vorlage erstellt.

<div class="row" style="margin-bottom: 50px;"> 
    <div class="col-sm-6 pull-right"> 
     <form method="get"> 
      <select id="men-filter-cat" class="form-control" name="category-filter" onchange="this.form.submit();"> 
       <option value="all">Filter by category</option> 
       {% for c in categories %} 
        <option value="{{ c.category }}" {% if selected == c.category %}selected=selected"{% endif %}> 
         {{ c.category }} 
        </option> 
       {% endfor %} 
      </select> 
     </form> 
    </div> 
</div> 

Ansichten.py

ich neu definiert mein Homeview auf die ausgewählte Anforderung mit einer variablen chosen_filter und meine views.py wird aufgerufen reagieren:

class HomeView(View): 
    def get(self, request, *args, **kwargs): 
     mentors = Mentor.objects.all() 
     chosen_filter = self.request.GET.get('category-filter') 
     if chosen_filter: 
      mentors = mentors.filter(category__category=chosen_filter) 
     return render(request, "mentoring_application/home.html", {"mentors": mentors, 'selected': chosen_filter, 'categories': Category.objects.all().order_by('category')}) 


def profile(request, pk, template='mentoring_application/profile.html'): 
    mentor = get_object_or_404(Mentor, pk=pk) # pk is primary key, so url will be site.com/profile/3 
    context = {'mentor': mentor} 
    return render(request, template, context) 

Dies ist, was für mich gearbeitet. Vielen Dank.

+0

Wenn Sie das Dropdown-Menü schließlich nicht verwendet haben, können Sie ein Listenelement in HTML verwenden, um Ihre Kategorien zu rendern und Ihren HTML-Code zum Senden an onClick zu definieren. –

Verwandte Themen