【问题标题】:Django - Filter Model Objects (Posts) Using FormDjango - 使用表单过滤模型对象(帖子)
【发布时间】:2018-12-09 18:34:48
【问题描述】:

所以我有一个名为 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,过滤器也不起作用,因为每当您提交表单时都会刷新输入。

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

【问题讨论】:

    标签: html django forms filtering


    【解决方案1】:

    在检查表单是否有效之前,尝试将 request.POST 数据传递给它:

    form = FilterOption(request.POST)
    

    【讨论】:

    • 谢谢。我忘了这样做,结果发现没有其他问题。我讨厌愚蠢的错误
    猜你喜欢
    • 1970-01-01
    • 2014-08-22
    • 2013-03-16
    • 2020-07-02
    • 2014-02-10
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多