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。
所以我有两个建议:
- 您可以更改检索代表的逻辑。例如,让代表的名字独一无二,这样你就可以在你的数据库中搜索这个名字,然后得到正确的 ID(我不知道这是否是好的做法)
- 您可以使用一个包含 id
的隐藏输入字段
感谢您查看我的问题:
如何在表单文本框中显示文本,但在 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。
所以我有两个建议:
- 您可以更改检索代表的逻辑。例如,让代表的名字独一无二,这样你就可以在你的数据库中搜索这个名字,然后得到正确的 ID(我不知道这是否是好的做法)
- 您可以使用一个包含 id 的隐藏输入字段