我的 Django Web 中的简单搜索引擎不起作用

Posted

技术标签:

【中文标题】我的 Django Web 中的简单搜索引擎不起作用【英文标题】:Simple search engine in my Django Web is not working 【发布时间】:2018-03-21 23:41:10 【问题描述】:

我正在尝试让我的搜索遍历我在 Django 中的数据库查询。

form.is_valid() 中的行是我添加到我的网站添加数据的其他表格,它工作得很好。 唯一的就是那个查询的东西.. 我只是不明白为什么在我点击搜索后我仍然看到所有帖子而不是我搜索的帖子..

views.py-

class HomeView(TemplateView):

    template_name = 'serverlist.html'

    def get(self, request):
        form = HomeForm()
        query = request.GET.get("q")
        posts = serverlist.objects.all()
        args = 'form' : form, 'posts' : posts
        return render(request, self.template_name, args)

    def post(self,request):
        form = HomeForm(request.POST)
        posts = serverlist.objects.all()

        query = request.GET.get("q")
        if query:
            posts = serverlist.filter(Project__icontains=query)

        if form.is_valid(): # Checks if validation passed
            post = form.save(commit=False)
            post.save()
            text = form.cleaned_data['ServerName']
            form = HomeForm()
            return redirect('serverlist')
        args = 'form': form, 'text': text
        return render(request, self.template_name,args)

index.html -

<div class="container">

    <br>
    <center><h1>DevOps Server List</h1></center>
    <br>
    <form method='GET' action=''>
        <input type='text' name='q' placeholder='Search Item'/>
        <input type='submit' value='Search' />
    </form>
    <table class="table table-hover">
    <thread>

      <tr>
        <th> Server Name </th>
        <th> Owner </th>
    <th> Project </th>
    <th> Description </th>
    <th> IP Address </th>
    <th> ILO </th>
    <th> Rack </th>
    <th> Status </th>
    <th>  </th>


</tr>
</thread>
<tbody>

            % for server in posts %

    <tr>
      <div class ="server">
        <td> server.ServerName </td>
        <td> server.Owner </td>
        <td> server.Project </td>
        <td> server.Description </td>
        <td> server.IP </td>
        <td> server.ILO </td>
        <td> server.Rack </td>
        <td> server.Status </td>

        <td>

forms.py -

class HomeForm(forms.ModelForm):
    ServerName = forms.CharField(widget=forms.TextInput,max_length = 30)
    Owner = forms.CharField(max_length = 50)
    Project = forms.CharField(max_length = 30)
    Description = forms.CharField(max_length = 255)
    IP = forms.CharField(max_length = 30)
    ILO = forms.CharField(max_length = 30)
    Rack = forms.CharField(max_length = 30)
    Status = forms.CharField(max_length = 30)
    class Meta:
        model = serverlist
        fields = ('ServerName' ,'Owner','Project','Description','IP','ILO','Rack','Status',)

【问题讨论】:

【参考方案1】:

你应该在你的 get 方法中添加过滤器:

posts = serverlist.objects.all() 
query = request.GET.get("q")
if query:
    posts = serverlist.objects.filter(Project__icontains=query)
    #                          ^^^^^^^^^^^^^^^^^^^^^^^

【讨论】:

您是否将搜索表单方法返回到GET 是的。该表单现在正在使用 GET 也许它仍然以某种方式执行 posts = serverlist.objects.all() .. 奇怪 搜索 Devops - 172.16.10.60:8000/?q=DevOps 看起来 HTML 没问题,但问题出在视图上 尝试posts = serverlist.objects.none()只是为了了解您的帖子是否正确,您应该得到空列表 因此,当我在 post 功能下执行此操作时,根本没有任何变化...(似乎我什至不需要在 post 下执行 posts=serverlist.object.all() 因为它从get获取信息。当我在get函数下执行它时,它会清除数据..所以也许我应该在get函数下进行搜索?或者最好将表单更改为POST并保持视图就像@脚本怪物说?【参考方案2】:

您正在 post 方法中执行搜索。因此,您需要使用 POST 方法发送数据。请按如下方式更改form标签中的方法。

<form method='POST' action=''>
    % csrf_token %
    <input type='text' name='q' placeholder='Search Item'/>
    <input type='submit' value='Search' />
</form>

当您使用 POST 方法时,您还需要使用 csrf。 % csrf_token % 模板标签用于此目的。

顺便说一句,您正在使用表单对象来验证您的表单。但是您在模板中手动创建了表单。您也应该使用它来创建 HTML。因此您的模板将是这样的:

<form method='POST' action=''>
    % csrf_token %
     form 
    <input type='submit' value='Search' />
</form>

这可以解决您关于表单无效的问题。由于您没有分享您的 HomeForm 资源,我无法确定。

【讨论】:

你也许是对的!但问题是,当我在分配之前引用的/局部变量“文本”处执行后 UnboundLocalError 时收到此错误,我多次收到此错误,我不知道在文本上放什么。我认为它等待数据作为其他形式的文本,我用来向网站添加数据,当它为空时(因为我只是搜索)它说我使用文本,即使它不包含任何数据(因为用于添加服务器的表单是空的)你知道怎么解决吗? @scriptmonster 通常用于搜索表单使用GET 方法,它允许交换搜索结果。 由于您没有在 if 语句之前分配文本变量,并且您的表单似乎无效,因此它会给您带来未绑定的错误。 @BearBrown你是对的,这可能是一个更好的用途。我认为这是一个简单的表单应用程序。 @EilonAshkenazi 请查看我上次关于直接渲染表单的更新,并检查它是否适合您。 我添加了 forms.py 但是你确定我应该将表单作为 post 而不是像 @BearBrown 建议的那样做吗?

以上是关于我的 Django Web 中的简单搜索引擎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django 的 JQueryUI 自动完成搜索不起作用

我的Android进阶之旅------&gt;Android中ListView中嵌套(ListView)控件时item的点击事件不起作的问题解决方法

搜索栏在 Django 网站上不起作用

将文件从iPhone上传到Django

Django Ajax 搜索不起作用

Django - 为啥视图中的“默认值”不起作用?