繁体   English   中英

在Django中搜索无效

[英]Search in django doesn't work

我正在尝试在我的页面上使用搜索选项。 我已经尝试了标准django文档在此链接“ https://docs.djangoproject.com/en/1.11/intro/tutorial01/ ”中给出的方法,但是我的搜索功能无法正常工作。 只有网址从http://localhost:8000/contact更改为http://localhost:8000/contact/your-contact/?q=harini但数据并未过滤和显示。 我正在使用Django 1.11。 有人可以帮我吗? 提前致谢

models.py

from __future__ import unicode_literals

from django.db import models

class ContactModel(models.Model):
    name = models.CharField(max_length=200)
    dob = models.DateField()
    phone_number = models.IntegerField()
    gender = models.BooleanField()
    address = models.CharField(max_length=200)

views.py

from __future__ import unicode_literals

from django.shortcuts import render

from django.http import HttpResponseRedirect, HttpResponse
from django.views import generic
from django.template.response import TemplateResponse

from django.views.generic import CreateView
from django.urls import reverse_lazy
from .models import ContactModel
from .forms import ContactForm

class ContactView(CreateView):
    model_class = ContactModel
    form_class = ContactForm
    success_url = reverse_lazy('contact-thanks')
    initial = {'name': 'value'}
    template_name = 'contact/contact.html'

    def get(self, request, *args, **kwargs):
        model = self.model_class()
        return render(request, self.template_name, {'model': ContactForm})

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':
            form = ContactForm(request.POST)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('thanks/')

            else:
                form = ContactForm()

                return render(request, 'contact.html', {'form': form})

class ContactlistView(CreateView):
    model = ContactModel
    template_name = 'contact/contactlist.html'

    def search(request):
        query = request.GET['q']
        t = loader.get_template('template/contact/contactlist.html')
        c = Context({ 'query': query,})

        if query:
            results = Contact.objects.filter(Q(name__icontains=query) |
                                             Q(dob__icontains=query) |
                                             Q(address__icontains=query) |
                                             Q(gender__icontains=query) |
                                             Q(phone_number__icontains=query))

            return render(request, 'contactlist.html', {'form': form})

        else:
            return render(request, 'contactlist.html', {'form': form})

urls.py

    from django.conf.urls import url

from . import views

app_name = 'contact'

urlpatterns = [
    url(r'^$', views.ContactView.as_view(), name='contact'),
    url(r'^your-contact/$', views.ContactView.as_view(), name='contact'),
    url(r'^your-contact/thanks/$', views.ContactView.as_view(), name='contact'),
    url(r'^contact-list/$', views.ContactlistView.as_view(), name='contactlist'),
    url(r'^contact-list/your-contact/$', views.ContactlistView.as_view(), name='contactlist'),
]

templates / contact / contactlist.html

<form method="get" action="contact-list/">
  <input type="text" id="searchBox" class="input-medium search-query" name="q" placeholder="Search" value= "{{ request.GET.q }}">
  {% if contact %}
  {% for each_contact in contacts %}
  <h3>Name: {{ contact.name }}</h3>
  <p>Dob: {{ contact.dob }}</p>
  <p>Gender: {{ contact.gender }}</p>
  <p>Address: {{ contact.address }}</p>
  <p>Phone Number: {{ contact.phone_number}}</p>
  {% endfor %}
  {% endif %}
  <input type="submit" class="btn" value="Search" >
</form>

您的表单操作指向your-contact/

<form method="get" action="your-contact/">

因此,此URL调用视图ContactView() ,而search查询过程ContactlistView()视图中

class ContactlistView(CreateView):
     ''' '''
    def search(request):
        query = request.GET['q']

一个解决方案是: 对URL模式进行一些编辑:

 url(r'^contact-list/$', views.ContactlistView.as_view(), name='contactlist'),

更改表单操作网址并将其指向该视图ContactlistView(): with contact-list/

<form method="get" action="contact-list/">

不要忘记将if q:替换为if query:

我认为您现在拥有的视图无济于事,您应该在以下位置对其进行修改:

class ContactlistView(CreateView):
    model = ContactModel
    template_name = 'contact/contactlist.html'

    def get(self, request):
        query = request.GET['q']
        t = loader.get_template('template/contact/contactlist.html')
        c = Context({ 'query': query,})

        if query:
            results = Contact.objects.filter(Q(name__icontains=query) |
                                             Q(dob__icontains=query) |
                                             Q(address__icontains=query) |
                                             Q(gender__icontains=query) |
                                             Q(phone_number__icontains=query))

            return render(request, 'contactlist.html', {'form': form})

        else:
            return render(request, 'contactlist.html', {'form': form})

另请注意以下几点:

  • 您是从CreateView继承而来的,但您并未创建任何内容,也没有从该视图中获得任何好处,因此应改用GenericView
  • 您正在将模板定义为类属性,但是随后您正在渲染,因此您正在手动执行所有操作,因为您没有(再次)获得CBV的优势

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM