我需要表单,在这里用户可以选择基于所选标签的旅游。我通过视图、自定义html表单和一些AJAX工具实现了它:
HTML表单:
<form id="add-destination" method="post">
{% csrf_token %}
<select name="tag_id" id="tag_id">
<option value=''>---</option>
{% for tag in tags %}
<option value={{ tag.id }}>{{ tag.name }}</option>
{% endfor %}
</select></br>
<select multiple="multiple" name="tours" id="tours">
</select></br>
<button type="submit">Submit</button>
</form>
按标签查看旅游
^{pr2}$JS公司:
$(function(){
$('#tag_id').change(function(e){
$('#tours').html('');
e.preventDefault();
$.ajax({
type: 'GET',
data: $(e.currentTarget).serialize(),
url: "/ru/tour/get_tours/",
success: function(data){
var tour_data = JSON.parse(data.tours);
if(data.status=='ok'){
$.each(tour_data, function(i, item) {
$('#tours').append('<option value='+item['pk']+'>'+item['fields']['title']+'</option>');
});
}else{
console.log("Not okay!")
}
}
});
})
});
这种方法很有效,但我知道这不是解决这个问题的正确方法。我想用django表单的功能来实现。在
所以我有模型旅行:
class Tour(models.Model):
title = models.CharField(max_length=255)
tags = models.ManyToManyField(Tag)
和形式:
class FiveDestinationForm(forms.Form):
tags = forms.ModelChoiceField(queryset=Tag.objects.all())
tours = forms.ModelMultipleChoiceField(queryset=????)
fields = ('tag', 'tours')
我发现了一些非常接近的问题,并试图通过在表单中重写__init__
方法来解决我的问题,正如建议的那样:
class MyForm(forms.Form):
tags = forms.ModelChoiceField(queryset=Tag.objects.all())
tours = forms.ModelMultipleChoiceField(queryset=Tour.objects.none())
def __init__(self, *args, **kwargs):
qs = kwargs.pop('tours', None)
super(MyForm, self).__init__(*args, **kwargs)
self.fields['tours'].queryset = qs
fields = ('tag', 'tours')
但我得到以下错误:
'NoneType' object has no attribute 'iterator'
所以我的问题是如何根据用户在ModelChoiceField中选择的内容为modelmultipechoicefield正确设置queryset?在
您看到的错误很可能是因为表单没有接收到“tours”参数(它将收到一个名为
data
的字典,它以未经验证的形式包含字段的数据),因此qs
变量将为None。在你可能应该这样做:
注意,我们在这里稍微绕过了django的表单机制,需要自己解析tag_id。不过,这没什么大不了的。在
从用户体验的优势来看,如果不使用ajax,这是一个很难解决的问题。所以我也不会完全否定你的解决方案。在
相关问题 更多 >
编程相关推荐