尝试检查有效性形式时 if _dict['form'].is_valid()
给出错误消息
AssertionError: Cannot filter a query once a slice has been taken.
我了解forms.py 中的phone = ChoiceTxtField(queryset=Clients.objects.order_by('-phone')[:1])
中的错误。添加表单时如何避免这个错误?
some.py
def checkRelatedAddForm(self, **kwargs):
context= {}
request_post = kwargs['request_post']
related_form = RelatedAddForm(request_post, prefix=self.prefix)
related_form.prefix = self.prefix
context['form'] = related_form
if related_form.is_valid():
#some code
else:
#some code 2
#ERROR AssertionError: Cannot filter a query once a slice has been taken
return context
forms.py
class ListTextWidget(forms.Select):
template_name = 'include/_forms_clients_datalist.html'
def format_value(self, value):
if value == '' or value is None:
return ''
if self.is_localized:
return formats.localize_input(value)
return str(value)
class ChoiceTxtField(forms.ModelChoiceField):
widget=ListTextWidget()
class RelatedAddForm(forms.ModelForm):
phone = ChoiceTxtField(queryset=Clients.objects.order_by('-phone')[:1]) #
class Meta:
model = Clients
fields = ['name', 'phone']
widgets = {
'name': forms.TextInput(attrs={'class': 'form-control', 'autocomplete': 'off'}),
}
include/_forms_clients_datalist.html
{% block javascript %}
<script>
$(document).ready(function () {
$('#ajax_phone_{{ widget.name }}').keyup(function () {
// create an AJAX call
$.ajax({
data: $(this).serialize(), // get the form data
url: "{% url 'ajax_request' %}?related=clients&data={{ widget.name }}",
// on success
success: function (response) {
if (response.is_exist == true) {
$("#ajax-{{ widget.name }}").text(response.is_taken.name);
var dataList = document.getElementById('{{ widget.name }}');
var input = document.getElementById('ajax_phone_{{ widget.name }}');
var request = new XMLHttpRequest();
document.getElementById('{{ widget.name }}').innerHTML = '';
response.is_taken.forEach(function(item) {
console.log(item)
var option = document.createElement('option');
option.value = item.id;
option.title = item.name;
option.text = item.phone;
dataList.appendChild(option);
});
}
},
error: function (response) {
console.log(response.responseJSON.errors)
}
});
return false;
});
$('#ajax_phone_{{ widget.name }}').on('change', function(){
$("#ajax-{{ widget.name }}").text($('#'+$(this).attr('list')).find('option[value="'+$(this).val()+'"]').text());
var opt = $('option[value="'+$(this).val()+'"]');
$('#id_clients-name').val(opt.length ? opt.attr('title') : 'No phone')
});
})
</script>
{% endblock javascript %}
<br>
<input id="ajax_phone_{{ widget.name }}" list="{{ widget.name }}"
{% if widget.value != None %} name="{{ widget.name }}" value="+7" {% endif %}
{% include "django/forms/widgets/attrs.html" %} autocomplete="off">
<span class="badge rounded-pill bg-warning text-dark" id="ajax-{{ widget.name }}" name="ajax-{{ widget.name }}"></span>
<datalist id="{{ widget.name }}">
</datalist><br>