как использовать условия И или ИЛИ в django при фильтрации - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу создать систему фильтрации, в которой, если пользователь выбирает год и месяц, должны отображаться учащиеся, принадлежащие только к месяцу этого года, а если пользователь выбирает только год, то должны отображаться все учащиеся, принадлежащие этому году. Этот код работает, если я выбрал год и месяц, но не работает как условие ИЛИ. Как я могу решить эту проблему

views.py

def serachstudent(request):
    year = request.GET['year']
    month = request.GET['month']
    if year or month:
        students = Student.objects.filter(Q(joined_date__year=year) | Q(joined_date__month=month))
        return render(request, "students/view_students.html", {'students': students})
    elif year and month:
        students = Student.objects.filter(Q(joined_date__year=year) & Q(joined_date__month=month))
        return render(request, "students/view_students.html", {'students': students})

шаблон

<form action="{% url 'students:search_student' %}" class='form-inline'>
          <!--<label for="month"></label>-->
          <select name="year">
            <option disabled selected>Select Year</option>
            <option value="2018">2018</option>
             <option value="2017">2017</option>
            <option value="2019">2019</option>
          </select>
          <!--<label for="month"></label>-->
          <select name="month">
            <option disabled selected>Select month</option>
            <option value="01">January</option>
            <option value="02">February</option>
             <option value="03">March</option>
            <option value="04">April</option>
            <option value="05">May</option>
            <option value="06">June</option>
             <option value="07">July</option>
            <option value="08">August</option>
             <option value="09">September</option>
            <option value="10">October</option>
             <option value="11">November</option>
            <option value="12">Decembery</option>

          </select>

     &nbsp; &nbsp;
                    <div>
                        <button type="submit" >Find Students</button>
                    </div>

      </form>

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Ваш код будет выдавать KeyError, если в теле запроса не указан месяц или год.

Измените эти строки

year = request.GET['year']
month = request.GET['month']

на

year = request.GET.get('year')
month = request.GET.get('month')

Таким образом, если они не указаны, по умолчанию они будут None, а ваш оставшийся код должен работать.

0 голосов
/ 24 апреля 2019
if request.GET['year']: year_query = Q(joined_date__year=int(request.GET['year'])
else : year_query = Q()
if request.GET['month']: month_query = Q(joined_date__month=int(request.GET['month'])
else : month_query = Q()

query = Q(month_query | year_query)
students = Student.objects.filter(query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...