Django搜索栏实施

时间:2016-08-08 18:28:27

标签: python ajax django

我正在尝试实现搜索栏来查询我的数据库并仅显示匹配项。当我点击提交时,它只是给我回“搜索”,这是我设置为默认值而不是打印错误。

ajax.py

...
def chunkSearcher(request):
test = request.GET.get('search_box', "SEARCH")
print(test)
....

Searcher.html

<form type="get" action="." style="margin: 0">
<input  id="search_box" type="text" name="search_box"  value="Search..." >
<button id="search_submit" type="submit" >Submit</button>

urls.py

 url(r'^ajax/chunk/Searcher/$',
    ajax.chunkSearcher, name='chunkSearcher')

views.py(由于某些原因,它实际上可以在这里工作,但它在我的ajax代码中无法识别相同的两行代码

def searcher(request):
# test = request.GET.get('search_box', "SEARCH")
# print(test)
this_main = Searcher(
    request          = request,
    num_elements     = Candidate.objects.all().count(),
    size             = 'col-xs-12',
    title            = 'Search',
    modelname        = 'Searcher',
    listing_fields   = [
        {'readable_name': 'Name',   'model_attribute': 'full_name()', 'subtext_model': 'email', 'color': 'False'},
        {'readable_name': 'Status', 'model_attribute': 'get_status_display()', 'color': 'True'},
        {'readable_name': 'Automated Status', 'model_attribute': 'get_auto_status()', 'color': 'True'},
        {'readable_name': 'Submitter', 'model_attribute': 'submitter', 'color': 'True'},
    ],
    listing_actions  = [
        {'tooltip': 'Search',  'color': 'success', 'icon': 'plus', 'permission': 'prog_port.add_candidate', 'modal': 'candidateform', 'controller': 'addCandidate'},
    ],
)

context = {
    'nav'    : Nav(request),
    'main'   : this_main,
    'fb'     : TestFeedback()
}
return render(request, 'prog_port/base.html', context)

widgets.py

class Searcher:
def __init__(self, request,
                   num_elements,
                   size                         = 'col-xs-12',
                   modelname                    = None,
                   title                        = None,
                   listing_fields               = None,
                   listing_actions              = None):#!!

    self.template = 'prog_port/widgets/Searcher.html'
    self.size = size
    self.modelname = modelname
    self.num_elements = num_elements
    self.num_pages = int(math.ceil( num_elements / 25.0))
    self.title = title
    self.listing_fields  = [x['readable_name'] for x in listing_fields]
    self.listing_actions = listing_actions

    for action in self.listing_actions:
        action['restricted'] = False
        if 'permission' in action:
            if not request.user.has_perm(action['permission']):
                action['restricted'] = True

1 个答案:

答案 0 :(得分:0)

在没有Ajax的情况下开始工作会更快一些。当您的表单的action属性指向当前页面的URL(而不是指向您的ajax视图的URL)时,GET请求将发送到与该页面的URL对应的视图 - 您的{{ 1}}在你的情况下查看。这就是为什么当您在该视图中包含这两行时,您能够获得要打印的预期值。

重要的是,由于searcher视图是呈现您网页的视图,因此在该视图中访问您的searcher值可让您过滤或以其他方式操纵传递到视图上下文中的查询集并最终显示只显示您想要显示的限制/过滤项目。

单独的Ajax视图无法立即访问所有这些内容。要使用单独的Ajax视图动态更新搜索结果,该视图将需要使用重新呈现页面所需的所有信息来响应您的请求。实际上,这通常意味着两件事之一:

  1. 您的搜索结果显示在search_box或其他已定义的内容区域中,您的Ajax视图会返回使用相应内容填充该内容区域所需的HTML,或

  2. 您的初始视图基于某些序列化的JSON呈现其模板,并且您的Ajax视图以该格式提供更新的信息,然后用于重新呈现模板。

  3. This is a good starting point for getting the hang of ajax with django.请注意示例代码中的视图如何使用某些div(HTTPResponse或呈现的模板)响应ajax调用,以及如何使用data成功/失败的功能。

    如果您的ajax视图返回了呈现搜索结果所需的HTML,您可以使用您的成功函数使用该新HTML更新页面上的搜索结果data(或表格或其他内容)。例如:

    views.py

    div

    的index.html

    def index(request):
        return render(request, "index.html")
    
    def ajax_update(request):
        return HttpResponse("<h1>Updated Header</h1>")
    

    现在点击... <div id="update_this_header"> <h1>Old header</h1> </div> <button id='updater'> ... <script> $("#updater").click(function() { $.ajax({ url: #url to ajax_update view success : function(data) { $("#update_this_header").html(data) }, failure : function(data) { ... } }); }); </script> 按钮应该使用我们的updater视图中的HttpResponse中返回的HTML更新update_this_header div的内容(我承认我没有对此进行测试,原谅我,如果有一个错字)。更新搜索结果的方式相同;您只需要在ajax视图中进行更多处理,以使用正确的HTML进行响应。

    我希望这有助于使事情更加清晰;如果我可以(尝试)更全面地解释,请告诉我。这里的重要内容是ajax视图将为您提供一些数据。您可以确保模板可以获取该数据并正确显示它。