首页 > 解决方案 > 如何使用 CheckboxSelectMultiple 创建可以为空的搜索

问题描述

大家好,我正在尝试创建一个搜索,它将有一些 CheckboxSelectMultiple。问题是当其中一个字段为空时,它在 /technology/ 处向我返回一个错误 MultiValueDictKeyError 但是当我选择每个字段之一时它正常工作但是当我尝试分页时,我在 /technology/ 处也收到此错误 MultiValueDictKeyError

表格.py

class TechnologySearchForm(forms.Form):
    CATEGORY_CHOICES = (
        (0,'Acabada'),
        (1,'Em Desenvolvimento'),
    )

    KIND_CHOICES = (
        (0, 'Produto'),
        (1, 'Processo'),
        (2, 'Software')
    )
    PATENT_CHOICES = (
        (0,'Depositada'),
        (1,'Licenciada'),
        (2,'Não Possui')
    )
    PATENT_TYPE_CHOICES = (
        (0, 'Patente De Invenção'),
        (1, 'Modelo de Utilidade')
    )


    title = forms.CharField(label="Título", max_length=50, required=False, widget=forms.TextInput(attrs={'class':'form-control'}))
    description = forms.CharField(label="Descrição", max_length=50, required=False,  widget=forms.TextInput(attrs={'class':'form-control'}))
    application_area = forms.CharField(label="Área de Aplicação", max_length=50, required=False,  widget=forms.TextInput(attrs={'class':'form-control'}))
    category = forms.ChoiceField(label="Categoria", choices=CATEGORY_CHOICES, widget=forms.CheckboxSelectMultiple(),required=False)
    kind = forms.ChoiceField(label="Tipo de Tecnologia", choices=KIND_CHOICES, widget=forms.CheckboxSelectMultiple(),required=False)
    patent = forms.ChoiceField(label="Patente", choices=PATENT_CHOICES, widget=forms.CheckboxSelectMultiple(),required=False)
    patent_type = forms.ChoiceField(label="Tipo de Patente", choices=PATENT_TYPE_CHOICES, widget=forms.CheckboxSelectMultiple(),required=False)

我的列表视图

class TechnologyListView(LoginRequiredMixin, ListView):
    model = Technology
    template_name = "technology/technology.html"
    paginate_by = 6


    def get_context_data(self, **kwargs):
        data = super(TechnologyListView, self).get_context_data(**kwargs)
        data['imagearea'] = self.request.GET
        data["filter_form"] = TechnologySearchForm(self.request.GET)
        return data

    def get_queryset(self, *args, **kwargs):
        qs = super(TechnologyListView, self).get_queryset(*args, **kwargs) 
        query = self.request.GET
        queryset = Technology.objects.filter(user=self.request.user)
        if query:
            qs = queryset.filter(
                Q(title__icontains=query['title']) &
                Q(description__icontains=query['description']) &               
                Q(category__in=query['category']) |
                Q(kind=query['kind']) |
                Q(patent__exact=query['patent']) |
                Q(patent_type__exact=query['patent_type'])
            )
         return qs

我的 html

{% extends "techbase.html" %}
{% load static %}
{% block content %}
{% include "includes/carousel.html" %}
    <br>
    <div class="container-fluid" >
        <div class="row">
            <div class="col-sm-2">
                <div style="margin-top:15% ">
                    <h1 class="title text-center">Filtro:</h1>
                    <form method="GET" action="{% url 'technology:tech_index' %}" novalidate>
                        {{ filter_form }}   
                        <br>                  
                        <input type='submit' value='Procurar' class='btn'>                    
                        <a class="btn btn-primary" href="{% url 'technology:tech_index' %}">Limpar Filtro</a>
                    </form>
                </div>

            </div>
            <div class="col-sm-10">
                <ul class="nav nav-pills nav-pills-shop">
                    <li class="mr15 active">
                        <a href="{% url 'technology:create_tech' %}"><i class="fa fa-bolt">
                        </i>Adicionar Tecnologia</a>                            
                    </li>
                </ul>
                <h1 class="title text-center">Minhas Tecnologias</h1>
                <div class="tab-content tab-shop mt15">
                    <div id="home" class="tab-pane row fade in active">
                        {% for item in object_list %}        
                        <div class="col-lg-4 col-md-4 col-sm-6 mb30">
                                <div class="view  no-margin" style="background-color: #cfcfcf">
                                    <!-- Blog Thumb -->
                                    <div class="product-container">

                                        {% if item.area_img %}                                                      
                                            <img class="img-responsive full-width" style="width:100%; height:200px" src="{{item.area_img.image.url}}" alt="..."> 
                                        {% else %}
                                            <img class="img-responsive full-width" style="width:100%; height:200px" src="{% static 'images/notavailable.png' %}" alt="...">                                                
                                        {% endif %}                                                                                          

                                    </div>
                                    <div class="mask">
                                        <div class="image-hover-content">
                                            <!-- Zoom + Blog Link -->
                                            <a href="{% url 'technology:detail_tech' item.pk %}"  >
                                                <div class="image-icon-holder"><span data-toggle="tooltip" data-placement="top" title="Visualizar" class="ion-eye image-icons"style="color:#fff"></span></div>
                                            </a>
                                            <a href="{% url 'technology:update_tech' item.pk %}">
                                                <div class="image-icon-holder"><span  data-toggle="tooltip" data-placement="top" title="Editar" class="ion-edit image-icons" style="color:#fff"></span></div>
                                            </a>
                                            <a data-toggle="modal" data-target="#delete-{{item.pk}}">
                                                <div class="image-icon-holder"><span data-toggle="tooltip" data-placement="top" title="Deletar" class="ion-ios7-trash image-icons" style="color:red"></span></div>
                                            </a>

                                            <div class="modal fade" id="delete-{{item.pk}}" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
                                                <div class="modal-dialog" role="document">
                                                    <div class="modal-content text-center">
                                                    <form action="{% url 'technology:delete_tech' pk=item.pk %}" method="post">
                                                        {% csrf_token %}
                                                        <div class="modal-header">
                                                            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                                                            <h2>Deletar</h2>
                                                        </div>
                                                        <div class="modal-body">
                                                            <p>Você deseja realmente deletar "{{ item }}"?</p>
                                                        </div>
                                                        <div class="modal-footer">
                                                            <button type="button" class="btn btn-success" data-dismiss="modal">Voltar</button>
                                                            <input class="btn btn-danger" type="submit" value="Confirmar" />
                                                        </div>
                                                    </form>
                                                    </div>
                                                </div>
                                            </div>

                                        </div><!-- /image hover content -->
                                    </div><!-- /mask-->
                                </div>
                                <div class="shop-product content-box-shadow">
                                    <a href="{% url 'technology:update_tech' item.pk %}"><h2>{{item.title}}</h2></a>
                                    <p>{{item.description|truncatechars:40}}</p>
                                </div>
                            </div>
                            {% if forloop.counter|divisibleby:4 %}
                            </li>
                            <li>
                            {% endif %}
                    {% endfor %}
                </div>
            </div>
            {% include "includes/paginator.html" %}
        </div>
    </div>
{% endblock content %}

在此处输入图像描述

标签: djangosearch

解决方案


Try this out, this sollution handle when choices is empty

https://gist.github.com/davidbgk/651080


推荐阅读