确保用户输入整数

时间:2017-12-27 21:17:59

标签: django python-3.x postgresql django-forms django-templates

我是Django的新手,我最近创建了一个系统,用户可以根据数字查找记录。这只是一个简单的搜索。系统编号有前导零,我希望系统识别带或不带零的数字。我已经能够实现这个系统,我正在使用以下代码转换用户指定的数字:

def get_queryset(self):
    queryset = super(SearchResultsView, self).get_queryset()
    search_query = int(self.request.GET.get("q"))
    if search_query:
        queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct()

只要用户输入一个数字,上面的代码就可以正常工作。如果他们拼错并包含字母,我会得到Base10的无效字面值。我理解错误,一封信不是INT。我整个下午的大部分时间都在寻找如何防止这个错误,我无法找到我正在寻找的东西。我试过做类似的事情:

    if search_query:
        try:
            queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct()
        except ValueError:
            q = 0000000
    return queryset

但这些字母仍然被解释,然后我再次收到Base10错误的无效文字。如何根据数字防止字母导致查询出现问题?

我还想到如果我为搜索查询删除转换为INT,这些字母不再会导致问题,系统也不会像我期望的那样返回任何内容,所以我有一个解决方法。只是想知道如何让系统同时执行这两个操作,接受这些字母,然后防止无效的文字错误并允许系统将输入转换为整数。提前感谢您的有用建议。

正如Daniel Roseman建议的那样,我尝试使用以下形式,但它似乎也没有发现错误......

类RequestNumberSearch(forms.Form):

q = forms.IntegerField(required=True)

def __init__(self, user, *args, **kwargs):
    super(RequestNumberSearch, self).__init__(*args, **kwargs)
    self.fields['q'].widget.attrs['class'] = 'name2'

def clean_q(self):
    data = self.cleaned_data['q']
    if q != int:  
        raise forms.ValidationError("Please enter valid numbers!")

    return data

1 个答案:

答案 0 :(得分:2)

您正在尝试在检查之前将查询转换为int。

search_query = self.request.GET.get("q")

if search_query.isdigit(): # check is digit
    queryset = Book.objects.filter(Q(request_number__icontains=search_query)).distinct()
    return queryset
elif ... : # another check
...
else:
    return 'query is erroneous'