簡體   English   中英

如何使用模板標簽調用django-taggit標簽

[英]How to call django-taggit tags using templates tags

我想使用Django Haystack和Elasticsearch過濾多個Django-taggit標簽,我在自定義表單中編寫了一個facet函數,但我無法檢索與模板中所選過濾器匹配的結果。

那怎么可能這樣呢?

我的models.py:

class Product(models.Model):
    title = models.CharField(max_length=255, default='')
    slug = models.SlugField(null=True, blank=True, unique=True, max_length=255, default='')
    description = models.TextField(default='')

    ptags = TaggableManager()

    image = models.ImageField(default='')
    timestamp = models.DateTimeField(auto_now=True)

    def _ptags(self):
        return [t.name for t in self.ptags.all()]

    def get_absolute_url(self):
        return reverse('product',
                       kwargs={'slug': self.slug})


    def __str__(self):
        return self.title

我的自定義forms.py:

from haystack.forms import FacetedSearchForm

class FacetedProductSearchForm(FacetedSearchForm):

    def __init__(self, *args, **kwargs):
        data = dict(kwargs.get("data", []))
        self.ptag = data.get('ptags', [])
        super(FacetedProductSearchForm, self).__init__(*args, **kwargs)

    def search(self):
        sqs = super(FacetedProductSearchForm, self).search()

        if self.ptag:
            query = None
            for ptags in self.ptag:
                if query:
                    query += u' OR '
                else:
                    query = u''
                query += u'"%s"' % sqs.query.clean(ptags)
            sqs = sqs.narrow(u'ptags_exact:%s' % query)

        return sqs

在Views.py中傳遞表單:

class FacetedSearchView(BaseFacetedSearchView):

    form_class = FacetedProductSearchForm
    facet_fields = ['ptags']
    template_name = 'search_result.html'
    paginate_by = 6
    context_object_name = 'object_list'

如果需要,網址:

urlpatterns = [
    url(r'^$', HomeView.as_view()),
    url(r'^admin/', admin.site.urls),
    url(r'^product/(?P<slug>[\w-]+)/$', ProductView.as_view(), name='product'),
    url(r'^search/', FacetedSearchView.as_view(), name='haystack_search'),

] + static(MEDIA_URL, document_root=MEDIA_ROOT)

最后,在模板方面,我有一個search_form.html:

{% load staticfiles %}
<div class="col-md-6">
    <form class="search-form-container" action="/search/" method="get">
        <div class="form-group">
            <div class="icon-addon addon-lg">
                <input type="text" placeholder="Search for good..." class="form-control" name="q" id="q" autocomplete="off">
                <div id="selction-ajax"></div>
            </div>
        </div>



        <div class="col-md-3">
                <dl>

           <!-- Checkbox is placed below -->

                <div>
                  <input class="facet" id="" type="checkbox" name="ptags" value="Solo" data-toggle="toggle" /> Solo
                </div>

                <div>
                  <input class="btn btn-info btn-sm pull-right" type="submit" value="apply filter" onclick="return onFacetChangeApplied();" />
                </div>

            </div>
    </form>
</div> 

謝謝。

在search_indexes中為ptags添加faceted=True后,運行命令

  1. python manage.py clear_index

  2. python manage.py update_index

編輯您的forms.py

         if self.ptag:
            query = None
            for ptags in self.ptag:
                if query:
                    query += u' OR '
                else:
                    query = u''
                    query += u'"%s"' % sqs.query.clean(ptags)
                    sqs = sqs.narrow(u'ptags_exact:%s' % query)

試試這個,並嘗試調試您的forms.py。

謝謝@ pankaj-sharma它運行python manage.py rebuild_index 我現在能夠按標簽進行過濾,但事實是我無法在搜索結果中調用我的標簽,如下所示:

 {% if  page_obj.object_list %}

  <ol class="row top20">

  {% for result in page_obj.object_list %}

   <div class="showcase col-sm-6 col-md-4">

           <a href="{{ result.object.get_absolute_url }}">
              <h3>{{result.object.title}}</h3>
              <img src="{{ result.object.image }}" class="img-responsive">
           </a>

<!-- I want to call it in the span below -->

          <div class="text-center">
          <span class="label label-info">{{result.object.ptags.name}}</span>
          </div>

    </div>
  {% endfor %}
 </ol>
</div>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM