【发布时间】:2015-05-29 11:13:28
【问题描述】:
我有两个模式表单字段:action 和 service:
class InputsModelExtended(models.Model):
service = models.CharField(max_length=1000, choices=SERVICE_CHOICES, blank=True)
action = models.CharField(max_length=1000, choices=ACTION_CHOICES, blank=True)
def __str__(self):
return self.input
class Meta:
ordering = ["service"]
unique_together = ('service', 'action')
我将它们传递给form.py 并创建了模型表单:
class InputsModelExtendedForm(ModelForm):
class Meta:
model = InputsModelExtended
#fields = ['service', 'action', 'input']
fields = '__all__'
widgets = {'service': forms.fields.Select(attrs={'class': 'service_select_box'}), 'input': forms.fields.TextInput(attrs={'placeholder': 'Enter an input', 'class': 'selectpicker'}), 'object': forms.fields.TextInput(attrs={'placeholder': 'Enter an object', 'class': 'selectpicker'})}
然后我在更改第一个字段时接受 ajax 发布请求:
$(document).ready(function() {
var select_box = $('.service_select_box')
select_box.on('change', function(e) {
console.log('event ', select_box.val());
data = { "csrfmiddlewaretoken": '{{ csrf_token }}', 'action': select_box.val()};
$.ajax({
url: "/ajaxrequest",
type: "POST",
data: data,
success: function (data) {console.log('success', data);},
error: function (data) {console.log('error', data);},
});
});
return false;
});
现在我应该如何将action 字段变体调整为service 中选择的选项?我尝试通过ajax_text将其发布到模板:
def ajax_test(request):
choices = {'assistant app' : (('ask' : (('Choose action', 'Choose action',), ('ask.friends','ask.friends',)),
'wisdom' : (('Choose action', 'Choose action',), ('wisdom.wisdom', 'wisdom.wisdom'))}
if request.is_ajax() and request.POST['action']:
action = request.POST['action']
#message = "ur action is " + str(request.POST['action'])
action_choices = choices[action.lower()]
else:
message = "empty or not an ajax"
form = InputsModelExtendedForm(request.POST or None, action_choices=action_choices) #passing form to template
InputsAll = InputsModelExtended.objects.all() #passing all objects to template
return render(request, 'inputs_forms_css.html', {'form': form, 'InputsAll': InputsAll, 'id': id})
但action 字段似乎不会在不刷新的情况下发生变化,尽管通过 ajax 成功响应我得到了正常的修改选择:
Service: <select class="service_select_box" id="id_service" name="service">
<option value="" selected="selected">---------</option>
<option value="Apps">Ask</option>
Action: <select id="id_action" name="action">
<option value="Choose action">Choose action</option>
<option value="ask.friends">ask.friends</option>
是否应该通过 jquery 修改第二个字段选择集,或者可以通过其他方式完成?提前谢谢。
【问题讨论】:
-
Django 期望在实例化表单时定义字段的选择。如果您通过 ajax 而不是服务器端更改客户端的选项,则您的表单将没有有效的选项。我的建议是在第二个选择中设置所有可用的选项,然后从第一个选择中过滤选项的可见性。
-
这也有一个很好的副作用,即不必对服务器进行任何额外的调用,并且总体上应该是更快的用户体验。
-
@Brandon 如何过滤可见性?
-
我会为第二个选择中的每个选项添加一个属性,该属性对应于第一个选择中的相关选项。它可以是 css 类、数据属性等。然后您可以通过 JavaScript 向第一个选择添加一个 on-change 处理程序,以隐藏第二个选择中不匹配的任何元素。
-
@Brandon 我将 .action_select_box 类分配给第二个字段。但是可以通过哪种jquery方法过滤这个字段? .html() ?
标签: jquery python ajax django forms