断言错误:获取切片后无法过滤查询。蟒蛇

时间:2021-07-03 20:39:13

标签: python django

尝试检查有效性形式时 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>

0 个答案:

没有答案
相关问题