Django:带有整数列表的表单

boi*_*ing 3 javascript forms django list multiplechoicefield

我有一个调用我的django应用程序的javascript应用程序(角度).它使用整数列表来过滤响应.在Django中,我使用表单来清理数据.

使用Javascript:

app.factory('SearchData', 
      function(){
            return {
                shop:[],
                sort:'',
                xhr:'',
                brand:[],
             };
       });
app.factory('SearchQuery',
        ['$http', '$location', '$route', 'SearchData', 
        function($http, $location, $route, SearchData){
            return {
                getItems: function(){
                    return $http.get('/search/',{
                        params: SearchData,
                        responseType: 'json',
                    });
                }
            };
        }
    ]);
Run Code Online (Sandbox Code Playgroud)

Python形式:

class SearchForm(forms.Form):
    shop = forms.IntegerField(widget=forms.SelectMultiple(),required=False)
    sort = forms.CharField(max_length=1, min_length=1, required=False)
    brand = forms.IntegerField(widget=forms.SelectMultiple(),required=False)
Run Code Online (Sandbox Code Playgroud)

我得到了商店和品牌的整数列表,但我不知道如何在django方面处理它.我不想使用MultipleChoiceField,因为我需要在表单中提供选择(这会创建一个不必要的查询).我想做的就是有一个整数列表.

上面的表单抛出"输入整数.".我可以放弃表单并使用request.GET.getlist('shop')(有效).但如果可能的话,我宁愿使用表格......

更新,现在我正在使用MultipleChoiceField并在视图中验证之前传递选项.喜欢:

shops = request.GET.getlist('shop', None)
sf = SearchForm(request.GET)
sf.fields['shop'].choices = shops
Run Code Online (Sandbox Code Playgroud)

它有效,但它不漂亮.

Udi*_*Udi 8

使用自定义小部件/字段:

from django import forms
from django.core.exceptions import ValidationError


class MultipleValueWidget(forms.TextInput):
    def value_from_datadict(self, data, files, name):
        return data.getlist(name)


class MultipleValueField(forms.Field):
    widget = MultipleValueWidget


def clean_int(x):
    try:
        return int(x)
    except ValueError:
        raise ValidationError("Cannot convert to integer: {}".format(repr(x)))


class MultipleIntField(MultipleValueField):
    def clean(self, value):
        return [clean_int(x) for x in value]


class SearchForm(forms.Form):
    shop = MultipleIntField()
Run Code Online (Sandbox Code Playgroud)