Django-使用表单过滤模型对象(帖子)

时间:2018-07-01 06:00:44

标签: html django forms filtering

所以我有一个名为Blog的模型

class Blog(models.Model):
    tagoptions = (
        (u'Project', u'Project'),
        (u'IT', u'IT'),
        (u'Robotics', u'Robotics'),
            . . .
        (u'-', u'-'),
    )
    user = models.TextField(blank=True, null=True)
    title = models.CharField(max_length=50, default='')
    context = models.TextField(max_length=5000, default='')
    ireceived = models.IntegerField(default=0, blank=True, null=True)
    personnelneeded = models.IntegerField(default=1)
    datewritten = models.DateField(default=datetime.date.today, blank=True, null=True)
    tags = models.CharField(max_length=100, choices=tagoptions, default='-')

    def __str__(self):
        return str(self.user) + ": id" + str(self.id) + " - title: " + str(self.title)

和使用“标签”过滤对象的表格

class FilterOption(forms.Form):
    tagoptions = (
        (u'showall', u'Show All'),
        (u'Project', u'Project'),
        (u'IT', u'IT'),
            . . .
        (u'-', u'-'),
    )
    tags = forms.ChoiceField(choices=tagoptions, initial="showall")
    tags.widget.attrs.update({'style' : 'color: black;'})

这是表单中用于模板过滤的部分。

    <form method="post" action="{% url 'posts' %}">
         {% csrf_token %}
         <p>{{ form.tags }} <input type="submit" name="filter" value="Filter"/></p>
    </form>

这是我在模板中用来显示最近10条最新帖子的信息。

{% for p in postshow|slice:":10" %}
      <br><br>
      <div class="postdisplay">
        <h1><a class="stuffurl" href="{% url 'posted' postid=p.id %}"><u>{{ p.title }}</u></a></h1>
        <h4>Post by <a class="stuffurl" href="{% url 'user' user_login_name=p.user %}"><u>{{ p.user }}</u></a>, {{ p.datewritten}}</h4>
        <h4>Tag: {{ p.tags }}
      </div>
      <br><br>
{% endfor %}

然后终于在我看来

def posts(request):
    postshow = Blog.objects.order_by('-id')
    if request.method == 'POST':
        form = FilterOption()

        if form.is_valid():
            filteropt = form.cleaned_data['tags']
            if filteropt != showall:
                postshow = Blog.objects.order_by('-id')

            else:
                postshow = Blog.objects.filter(tags=filteropt).order_by('-id')

    else:
        form = FilterOption()

    context = {'postshow' : postshow, 'form' : form}
    return render(request, 'home/posts.html', context)

每当我提交表单时,都应该检查输入内容是否显示全部。如果这样做,则不过滤任何内容;如果不过滤,则过滤对象,以便仅显示带有输入标签的对象。但是,代码似乎停留在form.is_valid(我使用print检查了)。另一个可能的问题是,即使它通过了form.is_valid,但由于您每次提交表单时都会刷新输入,因此该过滤器将不起作用。

如果有人可以帮助我修复我的代码,以便我可以选择一个标签,并且帖子将被过滤,并且如果我选择“显示全部”,则它会显示所有帖子而不过滤它们,将不胜感激。

1 个答案:

答案 0 :(得分:0)

在检查表单是否有效之前,请尝试传递请求。将数据发送到其中:

form = FilterOption(request.POST)