Фильтр - Как реализовать - PullRequest
1 голос
/ 22 мая 2019

Мне нужно реализовать фильтр с множественным выбором в моем программном обеспечении 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)

Мои urls.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})

Filtar.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 %}

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>

Forms.py

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')

Снимок экрана:

image

Теперь мой вопрос:

Моя проблема в том, что все, что я пишу в текстовых полях, ничего не делает, просто обновляет страницу с теми же данными.Имя динамически создаваемых текстовых полей должно быть «nameinput» и «yearinput»

1 Ответ

2 голосов
/ 22 мая 2019

Ваша форма отправит GET запрос на ту же страницу. Поэтому, когда представление начинает обработку, оно выбирает оба значения выбора (если они существуют), получает все Clanak объекты и фильтрует их на основе выбранных вариантов.
Таким образом, если фильтры не выбраны, вы получите все объекты. Если оба фильтра выбраны, он будет фильтровать как по именам, так и по году.

def filtar(request):
    choice1 = request.GET.get('Autor', None)
    choice2 = request.GET.get('Datum', None)
    data = Clanak.objects.all()
    if choice1:
        data = data.filter(naslov='NAME')
    if choice2:
        data = data.filter(datumObjave__year=2019)
    return render(request, 'filtar.html', {'data': data})

Обратите внимание, что на самом деле он не будет выполнять запрос до того, как вы попытаетесь получить к нему доступ (т.е. до тех пор, пока вы не отобразите html).

Кроме того, я бы посоветовал вам переключить эту форму на форму django, например:

forms.py:

class ChoiceForm(forms.Form):
    filter = forms.MultipleChoiceField(choices=(('Choice 1', 'Choice 1'), ('Choice 2', 'Choice 2')), widget=forms.CheckboxSelectMultiple)

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['filter']:
            data = data.filter(datumObjave__year=2019)
    return render(request, 'filtar.html', {'data': 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>
...