Django - фильтрует объекты модели (сообщения), используя форму - PullRequest
0 голосов
/ 01 июля 2018

Итак, у меня есть модель под названием Блог

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 (я проверил, используя печать) Другая возможная проблема заключается в том, что, даже если он сработал, передайте form.is_valid, фильтр не будет работать, так как ввод обновляется всякий раз, когда вы отправляете форму.

Буду очень признателен, если кто-нибудь поможет мне исправить мой код, чтобы я мог выбрать тег, и пост будет отфильтрован, а если я выберу «показать все», он покажет все посты без их фильтрации.

1 Ответ

0 голосов
/ 01 июля 2018

Перед проверкой правильности формы попробуйте передать в нее данные request.POST:

form = FilterOption(request.POST)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...