【问题标题】:Django Autocomplete, how to get the ID but show the text valueDjango Autocomplete,如何获取 ID 但显示文本值
【发布时间】:2019-11-30 16:36:04
【问题描述】:

感谢您查看我的问题:

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

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

当我在下面尝试此操作时,我可以使用 PK 发布表单,但显示的是 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 上的验证失败。

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

沙盒.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)

任何指针都将不胜感激,即使是我接下来可以搜索的内容,因为我似乎已经在这方面用尽了互联网。

非常感谢 格雷厄姆

【问题讨论】:

    标签: python jquery django autocomplete


    【解决方案1】:

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

    如果我正确理解您的问题,请澄清一下:

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

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

    所以我有两个建议:

    1. 您可以更改检索代表的逻辑。例如,使代表的名称独一无二,这样您就可以在数据库中搜索该名称并获得正确的 ID(我不知道这是否是一种好习惯)
    2. 您也许可以使用包含 id 的隐藏输入字段

    【讨论】:

    • 感谢您的回复。你已经正确理解了这个问题。关于第 1 点。好主意,但是 rep 是外键,因此验证失败。关于第 2 点,如果我知道如何将其与表单整合,我可以。我将从模型形式转换为普通形式并尝试第 1 点。
    • 哦,是的,我错过了forms.ModelForm。也许这可以帮助您在 django 的表单中隐藏输入字段:Django ModelForm to have a hidden input。让我知道它是否有效或者您需要更多建议,也许我可以进一步帮助您。
    • 我通过转换为 forms.form 解决了这个问题,并使用了您对隐藏字段的建议,这可以解决问题。 &lt;script&gt; $(function() { $("#autoc").autocomplete({ source: "/autocomplete/", minLength: 1, select: function (event, ui) { $("#hide1").val(ui.item.id); } }); });
    • 很高兴能帮上忙!
    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多