поиск в нескольких полях в приложении dajngo неверные результаты - PullRequest
0 голосов
/ 27 января 2019

Я хотел бы создать поиск по нескольким полям для моей базы данных в приложении django. моя поисковая работа верна, только если пользователь использует все поля из HTML-формы.

если пользователь не использует какое-либо поле или если какое-либо поле пустое или пустое тогда мой запрос возвращает все результаты (например, apps=movies.objects.all()), и это неправильно, потому что пользователь не обязан использовать все поля но в любое время использовать поля, где нужно для поиска.

есть идеи как это исправить?

вот мой код:

models.py:

class category(models.Model):
    title = models.CharField(max_length=100, blank=True, null=True)

class movies(models.Model):
    code = models.CharField(max_length=100, blank=True, null=True)
    code_2 = models.CharField(max_length=100, blank=True, null=True)
    name = models.CharField(max_length=100, blank=True, null=True)
    year = models.CharField(max_length=100, blank=True, null=True)
    movies_title=models.ForeignKey('category', blank=True, null=True)
    link=models.CharField(max_length=100, blank=True, null=True)

HTML-форма:

<form method="POST" action="{%url 'search'  %}">{% csrf_token %}
  <select name="link">
    <option value=""></option>
    <option value="0">link 1</option>
    <option value="1">link 2</option>
    <option value="2">link 3</option>
  </select>
  <select name="category">
    <option value=""></option>
    {% for data in cat%}
    <option value="{{ data.id }}">{{ data.title }}</option>
 {% endfor %}
  </select>
  <select name="year">
    <option value=""></option>
        {% for data in apps%}
    <option value="{{ data.id }}">{{ data.year }}</option>
 {% endfor %}
  </select>
    code: <input type="text" name="code"><br>
    code_2: <input type="text" name="code_2"><br>
    name: <input type="text" name="lname"><br>
  <input type="submit" value="Submit">
</form>

views.py:

def search_erga(request):
    apps=movies.objects.all()
    cat=category.objects.all()
    template='movies.html'

    query_link=request.GET.get('link')
    query_category = request.GET.get('category')
    query_year=request.GET.get('year')
    query_code = request.GET.get('code')
    query_code_2=request.GET.get('code_2')
    query_name = request.GET.get('name')

    if any(
        (
            query_link is not None,
            query_category is not None,
            query_year is not None,
            query_code is not None,
            query_code_2 is not None,
            query_name is not None,
        )
    ):
        apps_1=movies.objects.filter(link__icontains=query_link,
                                   movies_title__icontains=query_category,
                                   year__icontains=query_year,
                                   code__icontains=query_code,
                                   code_2__icontains=query_code_2,
                                   name__icontains=query_name)

        context={
            'apps':apps,
            'cat':cat,
            'apps_1':apps_1
        }
    else:
        context={
            'apps':apps,
            'cat':cat,
        }


    return render(request, template, context)

1 Ответ

0 голосов
/ 27 января 2019

Вы должны удалить apps_1, как указано в комментариях выше, и переименовать его movies.

Вы хотите сломать тег if.

Например:

if query_link != None or query_category != None:
    filters...

Это означает, что если query_link равно None, а query_category - нет, вы в конечном итоге будете искать приложения, не имеющие ссылки на запрос.

Вместо этого вы хотите:

movies = Movie.objects.all()

if query_link:
    movies = movies.filter(link__icontains=query_link)

if query_category:
    movies = movies.filter(movies_title__icontains=query_category)

...

В Python & Django вы можете положиться на простые условия, такие как if query_link:. Вам не нужно if query_link != None. Python делает то, что вы ожидаете. В других языках вам нужно будет проверить, не является ли оно нулевым и не пустой ли строкой; Python делает это для вас. Это работает для Django много 2 много полей, а также. Например, если достаточно user.memberships: (нет необходимости проверять, установлена ​​ли переменная и существует ли хотя бы одно членство) ...

...