Django 过滤器-如何实现

Django 过滤器-如何实现,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,我需要在Django软件中实现多选过滤器。 我有我的模型(数据库): models.py class Autor(models.Model): naziv = models.CharField(max_length=30, null=False, blank=True) email = models.EmailField(max_length=75, null=True, blank=True) def __str__(self): return str

我需要在Django软件中实现多选过滤器。 我有我的模型(数据库):

models.py

class Autor(models.Model):
    naziv = models.CharField(max_length=30, null=False, blank=True)
    email = models.EmailField(max_length=75, null=True, blank=True)

    def __str__(self):
        return str(self.naziv)      

class Clanak(models.Model):
    naslov = models.CharField(null=False, blank=True, max_length=120)
    datumObjave = models.DateField(null=False, blank=False)
    autor = models.ForeignKey(Autor, on_delete=models.CASCADE, null=True)   

    def __str__(self):
        return str(self.naslov) + ', ' + str(self.datumObjave) + ', ' + str(self.autor)
My URL.py:

urlpatterns = [
    path('filtar/',views.filtar, name='filtar'),
]
Views.py:

def filtar(request):
    form = ChoiceForm(request.GET or None)
    data = Clanak.objects.all()    
    if form.is_valid():
        if 'Choice 1' in form.cleaned_data['filter']:
            data = data.filter(naslov='name')
        if 'Choice 2' in form.cleaned_data['year']:
            data = data.filter(datumObjave__year='year')
    return render(request, 'filtar.html', {'data': data, 'form': form})
filter.html:

<!DOCTYPE html>
<html>
<head>
{% extends 'base.html' %}
{% block main_content %}
    <title></title>
</head>
<body>
<table border="1">

        <tr>
        <th>Naslov</th>
        <th>Datum</th>
        <th>Autor</th>
        </tr>
        {% for x in data %}
    <tr>
        <td>{{x.naslov}}</td>
        <td>{{x.datumObjave}}</td>
        <td>{{x.autor}}</td>
    </tr>   
    {% endfor %}
</table>
</body> 
</html>
{% endblock %}
截图:

现在我的问题是:

我的问题是,无论我在文本字段中写什么,它都不做任何事情,只是用所有相同的数据刷新页面。
动态创建的文本框的名称应为“nameinput”和“yearinput”

您的表单将向同一页面发送
GET
请求。因此,当视图开始处理时,它会获取两个选项值(如果它们存在),获取所有
Clanak
对象,并根据所选选项对它们进行过滤。
这样,如果未选择任何过滤器,您将获得所有对象。如果选择了两个过滤器,它将根据名称和年份进行过滤

def过滤器(请求):
choice1=request.GET.GET('Autor',None)
choice2=request.GET.GET('Datum',None)
data=Clanak.objects.all()
如果选择1:
data=data.filter(naslov='NAME')
如果选择2:
数据=数据.过滤器(datumObjave_uu年=2019年)
返回呈现(请求'filter.html',{'data':data})
请注意,在您尝试访问查询之前(即,在呈现html之前),它实际上不会执行查询

此外,我建议您将此表单切换为django表单,如下所示:

forms.py:

class选项表单(forms.Form):
filter=forms.multipleechoicefield(选项=(('Choice 1','Choice 1'),('Choice 2','Choice 2')),widget=forms.CheckboxSelectMultiple)
views.py:

def过滤器(请求):
表单=ChoiceForm(request.GET或None)
data=Clanak.objects.all()
如果form.is_有效():
如果form.cleaned_数据['filter']中的'Choice 1':
data=data.filter(naslov='NAME')
如果form.cleaned_数据['filter']中的'Choice 2':
数据=数据.过滤器(datumObjave_uu年=2019年)
返回呈现(请求'filter.html',{'data':数据,'form':form})
footer.html:

<br>
    <div>Filter: </div>
    <form>
      {% csrf_token %}
      <fieldset>
        <legend>Filtar - Thing that is being chosen</legend>

        {{ form.as_p }}

        <input type="submit" value="Submit">
      </fieldset>
    </form>
    <br>
    <div>Copyright by </div>

过滤器: {%csrf_令牌%} 被选中的东西 {{form.as_p}}
版权所有人
如果您可以同时选择这两个过滤器,为什么要将它们设置为
单选按钮而不是
复选框
?首先,我将其切换到了复选框-谢谢。我按你写的编辑了所有的东西。我现在尝试访问时出错。错误是:“模块'django.forms'没有属性'ChoiceForm'”。我在我的“views.py”中添加了“来自django导入表单”和“来自app_1.forms导入表单、ClanakForma、ChoiceForm”@juststart噢,这是因为我添加了整个文件而不是特定表单。请尝试从answer中更新版本,并添加表单,如从。表单导入选项表单
谢谢!一切正常,现在我只添加字段,这样我就可以发送参数,而不是使用固定的过滤器。哦,我以为你需要固定的过滤器。是的,您可以更改
ChoiceForm
以使用
form.CharField
来获取筛选变量。如果您有时间检查我上面的更新,请允许我检查一下,我正在尝试,但无法使其正常工作。当复选框被选中时,我添加了文本框,但现在当我按下提交按钮时,它什么也不做。
class ChoiceForm(forms.Form):
    filter = forms.MultipleChoiceField(choices=(('Choice 1', 'Choice 1'), ('Choice 2', 'Choice 2')), widget=forms.CheckboxSelectMultiple)
    name = forms.CharField(label='name')
    year = forms.CharField(label='year')
<br>
    <div>Filter: </div>
    <form>
      {% csrf_token %}
      <fieldset>
        <legend>Filtar - Thing that is being chosen</legend>

        {{ form.as_p }}

        <input type="submit" value="Submit">
      </fieldset>
    </form>
    <br>
    <div>Copyright by </div>