Django 1.10超级简单过滤器

时间:2017-03-20 22:40:18

标签: django python-3.x django-models

我正在寻找一种简单的方法来为我的对象实现过滤器。一个基本的。我能找到的只是Django + Haystack + Solr或Elasticsearch。我没有使用Java应用程序的经验。另外......我想保持简单。

我能得到的最接近的是django_filter,但是它的文档是......不是像我这样的菜鸟。再加上我不能用普通的Django做同样的事情吗?我能够使用没有solr的简单搜索工作:)我能够在管理员中使用过滤器,所以所有的工具都在那里。

如果有人可以指导我一步一步,如何设置我的模型的过滤器和状态。 模型

    class Contact(models.Model):
    name = models.CharField(max_length=2000
    phone = models.CharField(max_length=10)
    url = models.URLField(max_length=200, default="https://")
    email = models.EmailField(max_length=25, verbose_name="Email", default="adress@email.com")
    STATUS = (
('A','Active'),
('U','Unactive')
        )
    status = models.CharField(max_length=1, choices=TYPE, default="A")
        def _unicode_(self):
        return self.name
    def _str_(self):
        return self.name

我对搜索工作的看法:

def index(request):
    #full list
    queryset_list = Contact.objects.all()
    #search
    query = request.GET.get("q")
    if query:
        queryset_list = queryset_list.filter(
            Q(name__icontains=query)|
            Q(phone__icontains=query)|
            Q(url__icontains=query)| 
            Q(email__icontains=query)| 

    #pagination
    paginator = Paginator(queryset_list, 10)
    page_request_var = "page"
    page = request.GET.get(page_request_var)
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        queryset = paginator.page(1)
    except EmptyPage:
        queryset = paginator.page(paginator.num_pages)

    context = {
        "object_list": queryset,
        "name" : "List",
        "page_request_var": page_request_var,
            }

    return render(request, "index.html", context)   

1 个答案:

答案 0 :(得分:1)

我为您提供了一个最低限度的示例,以便在您遇到错误时阅读一些文档。

首先,将您的状态选择放入设置文件中,以防万一,您可以在其他地方使用。

STATUS_CHOICES = (
    ('A','Active'),
    ('U','Unactive')
)

然后您需要创建一个过滤器集,暂时将其放入models.py

from django.conf import settings
import django_filters

class SearchFilter(django_filters.FilterSet):
    status = django_filters.ChoiceFilter(choices=settings.STATUS_CHOICES)

    class Meta:
        model = Contact

然后在你看来:

def index(request):
    queryset_list = Contact.objects.all()
    query = request.GET.get('q', '')

    if query:
        queryset_list = queryset_list.filter(
            Q(name__icontains=query) | Q(phone__icontains=query) |
            Q(url__icontains=query) | Q(email__icontains=query)
        )

    filtered = SearchFilter(request.GET, queryset=queryset_list)
    context = {
        'filtered': filtered,
    }

    return render(request, 'index.html', context)

最后在模板中放了这个:

...
{{ filtered.form.status }}
...