Как я могу отфильтровать данные в django? - PullRequest
1 голос
/ 23 января 2020

Я использовал пагинацию для своего просмотра и могу искать данные по ключевым словам subject_name, но теперь я хочу искать их по продолжительности их темы в раскрывающемся формате.

views.py

def servicesview(request):
    key = request.GET.get("search_key", "")
    inst = request.GET.get("search_key1", "")
    q_objects = Q()
    if key:
        q_objects.add(Q(subject_name__icontains=key), Q.AND)
    if inst:
        q_objects.add(Q(subject_duration=inst), Q.AND)
    if q_objects:
        services = ServicesData.objects.filter(q_objects)
    else:
        services = ServicesData.objects.all()
        page = request.GET.get('page', 1)
        paginator = Paginator(services, 2)
    try:
        services = paginator.page(page)
    except PageNotAnInteger:
        services = paginator.page(1)
    except EmptyPage:
        services = paginator.page(paginator.num_pages)
    return render(request, 'services.html',
               {'services': services, 'key': key,'inst':inst})

services . html

<form>
   <input type="text" name="search_key" value="{{key}}" 
    placeholder="Search..">
    <select>
        <option name="search_key1" value="{{inst}}">Select your 
    option</option>
    </select>
    <input type="submit" value="Submit">
    </form>

Но я не получаю данные по продолжительности темы:

enter image description here

Пожалуйста, помогите кому-нибудь

Ответы [ 3 ]

0 голосов
/ 23 января 2020

Вы не заполняете свой соответственно. Вам нужно l oop над возможными опциями в html, например,

<select>
    <option name="search_key1" value="">Make you choice</option>
    {% for service in services %}
    <option name="search_key1" value="{{ service.subject_duration }}">{{ service.subject_duraion }}</option>
    {% endfor %}
</select>

Однако, поскольку я могу себе представить, что может быть несколько сервисов с одинаковыми service_durations, я бы порекомендовал явно создать набор запросов различных service_durations в вашем представлении, а затем передать его в ваш шаблон, например, в вашем представлении:

service_durations = Service.objects.order_by('service_duration*).values('service_duration').distinct()

, затем добавьте это в контекст вашего рендера и l oop поверх него, как описано выше.

0 голосов
/ 24 января 2020

Ответ должен понравиться

def servicesview(request):
    keyword = Db.objects.all().values_list('keyword', flat=True)
    sub = request.GET.get("search_key", "")
    q_objects = Q()
    if sub:
        q_objects.add(Q(subject_name__icontains=sub), Q.AND)
    if q_objects:
        services = ServicesData.objects.filter(q_objects)
    else:
        services = ServicesData.objects.all()
    page = request.GET.get('page', 1)
    paginator = Paginator(services, 2)
    try:
        services = paginator.page(page)
    except PageNotAnInteger:
        services = paginator.page(1)
    except EmptyPage:
        services = paginator.page(paginator.num_pages)
    return render(request, 'services.html',
              {'services': services, 'sub': sub, 'keyword':keyword})
0 голосов
/ 23 января 2020

Попробуйте это.

q_objects соберет все данные фильтра и передаст в набор запросов.

from django.db.models import Q

def servicesview(request):
    key = request.GET.get("search_key", "")
    search_key1 = request.GET.get("search_key1", "")
    q_objects = Q()
    if key:
        q_objects.add(Q(subject_name__icontains=key), Q.AND)
    if search_key1:
        q_objects.add(Q(search_key1=search_key1), Q.AND)
    if q_objects:
        services = ServicesData.objects.filter(q_objects)
    else:
        services = ServicesData.objects.all()
        page = request.GET.get('page', 1)
        paginator = Paginator(services, 2)
        try:
            services = paginator.page(page)
        except PageNotAnInteger:
            services = paginator.page(1)
        except EmptyPage:
            services = paginator.page(paginator.num_pages)
    return render(request, 'services.html',
                   {'services': services, 'key': key})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...