我是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
答案 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'