2017-06-05 49 views
1

我进入Python-Django 2个月,我没有完整的体验来继续我想做的事情。基于django-admin创建的类别在引导下拉列表中创建Django过滤器

我喜欢营造一种过滤器或过滤器下拉这样,任何人都可以从for循环渲染类别的下拉过滤或按类别搜索选择。我成功地创建一个完整的搜索与草垛与嗖(您可以测试我的草垛搜索here与类称为营销搜索)

有人可以阐明我怎么可以根据类别来筛选列表更多的光线在循环落下?我真的很困惑。

下面的代码到我的工作草堆搜索

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> 

程式网址配置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'), 
] 

项目URL配置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) 

为了更清楚,此图片显示了一个类别过滤器我喜欢做。

the picture here

+0

什么是发送模板数据的视图方法?你可以发布吗? –

+0

@TimS。我不确定我是否理解你的问题,但我已根据要求进行了更新。但是,我希望按类别创建过滤器。 –

+0

通常,它的工作原理是您的视图基于您的过滤条件构建对象,然后将过滤后的对象/查询集发送到模板以作为下拉列表呈现。我之前没有专门做过,但是它的视角将数据发送到模板进行渲染。 –

回答

0

按照由@TimS和其他一些来自其他社区的帮助给出的评论,我写了一个解决办法,按类别进行过滤和它的作品。

下面是做了它的工作黑客:

home.html的

这是从类别表中的环形下拉。我创建了一个名为category-filter的名称元素,用于选择我的模板上的类别。

<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> 

views。PY

我重新定义了我的HomeView向一个叫chosen_filter变量选择的要求作出回应,我的views.py变为:

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) 

这是对我工作。谢谢。

+0

如果您最终没有使用下拉菜单,那么您可以在html中使用列表项来呈现您的类别并定义您的HTML以提交onClick。 –