【问题标题】:Django JQuery AutocompleteDjango JQuery 自动完成
【发布时间】:2018-03-16 21:08:05
【问题描述】:

我正在尝试向我的表单添加一个自动完成字段。但是我不能上班。我几乎尝试了所有教程。 请求发送正常,我收到 200 响应。在开发人员工具窗格中,当我单击请求时,在响应选项卡上,我看到了整个 HTML 文件。不应该有一个json格式的东西..?? 代码如下:

models.py

class Signers(models.Model):
    uid = models.IntegerField(primary_key=True)
    firstName = models.CharField(max_length=255)
    lastName = models.CharField(max_length=255)

views.py

def get_signers(request):
  if request.is_ajax():
    q = request.GET.get('term', '')
    signers = Signers.objects.filter(uid__icontains=q)[:20]
    results = []
    for s in signers:
      signer_json = {}
      signer_json['id'] = s.uid
      signer_json['label'] = s.uid
      signer_json['value'] = s.uid
      results.append(signer_json)
    data = json.dumps(results)
    print data
  else:
    data = 'fail'
  mimetype = 'application/json'
  return HttpResponse(data,mimetype)

urls.py

url(r'^get_signers/', views.get_signers, name='get_signers'),

praxis.html(我的模板)

<script>

  $(function() {
    $("#id_signerIds").autocomplete({
      source: "get_signers/",
      minLength: 2,
    });
  });

</script>

<script>
$(document).ready(function() {

              $('#id_submissionTimestamp').hide();
              $('#id_issueDate').hide();
});
</script>

{% endblock page_head %}


{% block content %}

<form method="POST" class="post-form">{% csrf_token %}

<!--some other fields here... -->

<div class="ui-widget">
  <label for="id_signerIds">Signers: </label>
  <input id="id_signerIds">
</div>

<button type="submit" class="save btn btn-default">Save</button>

 </form>

{% endblock %}

【问题讨论】:

  • “但我无法工作” 究竟是什么不工作?
  • @PacoH。当我输入一些数字时,输入字段下方不会显示应有的结果
  • 我明白了。试试JsonResponse。如果它不起作用,请将请求的响应包含到get_signers/
  • 您有多个问题,我想您想进行 ajax 调用,但您无处初始化。我建议将source: "get_signers/", 中的“get_singers”更改为变量并像source: "{{get_singers}}" 一样传递它。如果您真的想进行 ajax 调用(更好的解决方案但更难),您必须在用户按下键时触发,将键入的键发送到您的视图并发回一些数据。

标签: jquery python json django autocomplete


【解决方案1】:

首先,当您使用 Django 时,我建议您按名称键入 url,就像这样,如果您更改视图的 url,则无需在 cmets 中的任何地方更改它,因此您可以使用 source: "get_signers/", 代替source: "{% url 'get_signers' %}",.

现在回到问题,我建议您将代码更改为:

signers = Signers.objects.filter(uid__icontains=q)[:20]
results = []
for signer in signers:
    signer_json = signer.name
    results.append(signer_json)

为了提供我的工作案例,我会给你我的代码:

views.py

def company_autocomplete(request):
    if request.is_ajax():
        query = request.GET.get("term", "")
        companies = Company.objects.filter(name__icontains=query)
        results = []
        for company in companies:
            place_json = company.name
            results.append(place_json)
        data = json.dumps(results)
    mimetype = "application/json"
    return HttpResponse(data, mimetype)

urls.py

url(r'^api/company-autocomplete/', company_autocomplete, name='company-autocomplete'),

add_company.html

...
<div class="form-group bmd-form-group">
  <label class="bmd-label-static" 
         for="company_autocomplete_input">Cerca azienda</label>
  <input id="company_autocomplete_input" class="form-control"
         placeholder="Nome azienda" style="width:500px">
</div>
... 
<button class="btn btn-raised btn-primary" type="submit"
        style="background-color:#1A88B9;">Aggiungi</button>
<script>
  $(function() {
    $("#company_autocomplete_input").autocomplete({
      source: "{% url 'company-autocomplete' %}",
      minLength: 1,
    });
  });
</script>
...

还有最重要的: 确保在自动完成输入之前添加 jQuery

<!-- jQuery !-->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"> </script>
<!-- jQuery UI !-->
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css">
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>

【讨论】:

  • 我不确定您是否可以使用名称 URL 作为 jquery 的源。因为那是在 JQ 中,而不是在模板中,并且 jquery 不知道 {% url ....%} 是什么意思。所以它会这样做: /currenturl/{% url .... %}?term=....
  • @logicOnAbstractions 是的,因为 Django 之前会将它们转换成字符串。
  • 您实际上并没有对此进行测试,不是吗?我刚刚做了——而且似乎不会。 “源”在 JAVASCRIPT 中定义。您正在使用的命名 url 表示法由 django TEMPLATE 引擎使用。这部分代码不是由渲染器渲染的。因此,您要调用的只是 /{% url ... %}。您需要指定一个 URL 字符串,或者作为数据表中的文档将源解释为一个函数。
  • 我想我使用的是一个 enternal 文件而不是 scrip 标签......也许它的行为不同?但我仍然看不出您提供的命名网址会被解析为实际网址的原因。
  • @logicOnAbstractions 该脚本是 diango 模板的一部分,所以 Django 会在实际的 url 中翻译它;在我正在从事的项目中,它起作用了,也许您正在做一些不同的事情?如果您告诉我,也许我可以帮助您解决您的问题:) 编辑:是的,如果您在外部文件中使用它肯定不会工作,正如您从我提供的标签脚本中看到的那样,html 文件中
猜你喜欢
  • 2011-07-01
  • 2018-09-05
  • 2017-06-24
  • 1970-01-01
  • 2016-12-27
  • 2014-10-23
  • 2014-10-22
  • 2013-04-24
  • 1970-01-01
相关资源
最近更新 更多