【问题标题】:Ensure User Entered Integer确保用户输入整数
【发布时间】: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


【解决方案1】:

您正试图在检查之前将查询转换为 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'

【讨论】:

    猜你喜欢
    • 2014-01-30
    • 2018-11-26
    • 2010-10-15
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2020-04-12
    相关资源
    最近更新 更多