【发布时间】:2018-06-08 11:40:12
【问题描述】:
我是 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
【问题讨论】:
-
这正是表格的用途。
-
@Daniel Roseman..是的,我也尝试为此目的利用表单...我添加了表单,但它似乎仍然不起作用....
-
但是如果你想让它验证这个值是一个整数,你为什么不使用 IntegerField 而不是 CharField?
-
将表单更改为 IntegerField 给了我想要的东西。谢谢丹尼尔罗斯曼。
标签: django python-3.x postgresql django-forms django-templates