【发布时间】:2019-07-01 07:40:59
【问题描述】:
每次在特定字段中选择下拉值时,我想填充一个 django 表单字段。
示例:
我有一份企业列表(企业 A、企业 B,...)和国家/地区列表。每个企业都位于特定的国家/地区。
Business A --> France
Business B --> Germany
Business C --> England
在我的表单中,当我在dropdown list 中选择特定业务时,我想立即用相关国家/地区填充国家/地区字段。如果业务发生变化,关联国家也会发生变化。
我正在使用 Django 1.11.18
上下文:
在我的代码中,MemberState 对应于我上面的示例中的 Country,RBI 对应于业务。
我的模特:
class MemberState(models.Model):
name = models.CharField(max_length=256, verbose_name=_('Name'))
code = models.CharField(max_length=256, verbose_name=_('Code'))
class RBI(models.Model):
short_name = models.CharField(max_length=256, verbose_name=_('Short name'), unique=True)
member_state = models.ForeignKey(MemberState, verbose_name=_('Member State'))
...
我的表格:
class FinalProductSearchForm(forms.Form):
releasing_body = ShortNameModelChoiceField(queryset=RBI.objects.filter(active=True).order_by('short_name'), required=False,
widget=forms.Select(), empty_label=_('Select'), label=_('Releasing Body/Institution'))
member_state = forms.ModelChoiceField(queryset=MemberState.objects.filter(active=True).order_by('name'), required=False,
widget=forms.Select(), empty_label=_('Select'), label=_('Member state'))
...
我想在我的表单中选择一个releasing_body 并预先填写相关的 member_state 字段。每次我更改 realeasing_body 时,它都会加载关联的 member_state。
我在 Django 中尝试了一些东西,但我需要 AJAX 请求。不幸的是,我从来没有做过这种事情。
我的 AJAX 部分工作:
所以,这是我的第一次尝试(不起作用):
我在 views.py 文件中创建了这个函数:
def ajax_member_state_request(request):
if request.is_ajax():
release_body = request.GET.get('releasing_body', None)
print(release_body)
member_state_ini = ReleaseBodyInstitution.objects.values_list('member_state', flat=True).get(id=release_body)
print(member_state_ini)
member_state = MemberState.objects.get(id=member_state_ini)
print(member_state)
return JsonResponse({'member_state': member_state})
在我的 urls.py 文件中,我添加了:
url(r'^finalproduct/list/$', FinalProductListView.as_view(),
name='finalproduct-list'),
url(r'^finalproduct/list/ajax_member_state_request/$', views.ajax_member_state_request, name='ajax_member_state_request'),
最后在我的 HTML 文件中:
<form id="providerForm" data-provider-url="{% url 'ajax_member_state_request' %}" class="navbar-search" method="GET" action="{{ url }}">
{% csrf_token %}
<div class="row">
<div class="col-md-5">
{{ search_form.releasing_body|as_crispy_field }}
</div>
<div class="col-md-5">
{{ search_form.member_state|as_crispy_field }}
</div>
</div>
<input type="submit" class="btn btn-default" value="{% trans 'Search' %}" />
<input type="button" class="btn btn-default" name="clear" value="Reset" onclick="clearForm(this.form);">
</form>
AJAX 部分如下所示:
$("#id_releasing_body").change(function () {
var url = $("#providerForm").attr("data-provider-url");
var releasingBodyId = $(this).val();
$.ajax({
url: url,
type: 'GET',
dataType: 'json',
data: {
'releasing_body': releasingBodyId
},
success: function (data) {
$("#id_member_state").val(data.member_state);
}
});
});
【问题讨论】:
-
因为你显然有一个带有
name属性的 URL,我猜你已经为你的 URL 命名了,在这种情况下你需要这样做:data-provider-url="{% url <namespace>:'ajax_member_state_request' %}"。请参阅此处的文档:docs.djangoproject.com/en/2.1/topics/http/urls/… -
好的,通过添加命名空间,我没有
reverse url的问题。但它不显示与选中的releasing_body关联的member_state--> AJAX 部分或我的 django 函数。 -
我刚刚注意到您的 Ajax 视图引用
ReleaseBodyInstitution.objects.get(id=release_body).member_state- 但您的模型被称为RBI。您的 Ajax 请求是否引发错误? (检查浏览器中的网络选项卡。) -
是的
RBI.objects.get(id=release_body).member_state在我的代码中写得很好。我道歉并更新我的问题。 -
URL 模式
r'^ajax/ajax_member_state_request/$'是否已列在 Django 尝试的模式列表中?
标签: javascript ajax django ajaxform