Django 自动完成,如何获取 ID 但显示文本值

Django Autocomplete, how to get the ID but show the text value

感谢您查看我的问题:

如何在表单文本框中显示文本,但在 post 表单中检索 ID。

使用自动完成功能一切正常,期望正确显示代表姓名。

当我在下面尝试此操作时,我可以使用 PK post 表格,但显示的是 pk 编号而不是代表姓名。我想在文本框中看到代表姓名

view.py

            rep_json = {}  
            rep_json['id'] = item.pk
            rep_json['label'] = f'{item.rep_first_name} {item.rep_last_name}'
            rep_json['value'] = item.pk

我已经尝试了各种组合来让它工作,但是当我可以在文本框中显示文本时,pk 验证失败。

正在自动完成的字段是外键,因此验证失败。

sandbox.html

<script>
$(function() {
  $("#autoc").autocomplete({
    source: "/autocomplete/",
    minLength: 2,
  });
});
</script>

<form method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

forms.py

class sales_form2(forms.ModelForm):
    class Meta:
        model = sales
        fields = (
            'position',
            'rep',     
            'comm'    )

        widgets = { 'rep':  forms.TextInput(attrs={'style':'width:100px','data-url':'autocomplete/','id':'autoc'})}

views.py - 自动完成

def sandbox_complete(request):
    if request.is_ajax():
        q = request.GET.get('term', '')
        theReps = reps.objects.filter(Q(rep_first_name__icontains = q)|Q(rep_last_name__icontains=q))

        results = []
        for item in theReps:
            rep_json = {}  
            rep_json['id'] = item.pk
            rep_json['label'] = f'{item.rep_first_name} {item.rep_last_name}'
            rep_json['value'] = item.pk 

            results.append(rep_json)
        data = json.dumps(results)
    else:
        data = 'fail'
    mimetype = 'application/json'
    return HttpResponse(data, mimetype)

任何指点都将不胜感激,甚至是我接下来可以搜索的内容,因为我似乎已经用尽了互联网上的这一点。

非常感谢 格雷厄姆

我对 Whosebug 很陌生,但我最近在我的一个 django 项目中使用了自动完成功能。

澄清一下我是否正确理解了你的问题:

您将 TextInput 的值设置为 item.pk,这样您将看到 PK 显示在您的 TextInput 字段中。

如果您将该值设置为代表的姓名,您的 TextInput 字段将显示正确的代表姓名,但在 POST 上,您的视图将仅获取代表姓名而不是 ID。

所以我有两个建议:

  1. 您可以更改检索代表的逻辑。例如,让代表的名字独一无二,这样你就可以在你的数据库中搜索这个名字,然后得到正确的 ID(我不知道这是否是好的做法)
  2. 您可以使用一个包含 id
  3. 的隐藏输入字段