当前位置: 首页 > 知识库问答 >
问题:

Django 提高值错误: 在 POST 上以 10 为基数的 int() 的文字无效

广乐邦
2023-03-14

Django总是在向服务器发送的每个POST请求上抛出<code>ValueError</code>。从浏览表单和SE来看,这似乎是我的Django模型的一个问题。但是,我不确定为什么模型会抛出这个错误,或者为什么Django会调用它们,因为这是在POST事件中抛出的。

有问题的视图:

def channel(request, channel):
    user_form = weblog_userForm(request.POST or None)
    if request.method == 'POST' and user_form.is_valid():
        nickname = user_form.cleaned_data['nickname']
        message = user_form.cleaned_data['message']
        password = user_form.cleaned_data['password']
        postDetails = {}

        ... process request and eventually ...

        return HttpResponse(json.dumps(postDetails), content_type="application/json")

我的应用程序模型:

class Line(models.Model):
    message = models.TextField(blank=True, default="")
    nick = models.CharField(max_length=50)
    hostname = models.CharField(max_length=300)
    channel = models.CharField(max_length=200)
    timestamp = models.DateTimeField(auto_now_add=True)
    LINE_TYPES = (
        ('PMSG', 'PRIVMSG'),
        ('SMSG', 'SOCKETMSG'),
        ('WMSG', 'WEBMSG'),
        ('NTCE', 'NOTICE'),
        ('ACTN', 'ACTION'),
        ('JOIN', 'JOIN'),
        ('PART', 'PART'),
        ('QUIT', 'QUIT'),
        ('NICK', 'NICK'),
        ('TPIC', 'TOPIC'),
    )
    msgType = models.CharField(max_length=4, choices=LINE_TYPES, default='PRIVMSG')

    def __str__(self):
        return self.message

class banned_ips(models.Model):
    bannedIp = models.GenericIPAddressField()

追溯:

Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/django/weblogs/log/views.py", line 96, in channel
    json_data = serializers.serialize("json", list(reversed(Line.objects.filter(id__gt=latest_line_id, channel=channel).order_by('-id')[:100])))
File "/usr/local/lib/python3.5/dist-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 836, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/query.py", line 854, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1252, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1276, in _add_q
    split_subq=split_subq,
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1214, in build_filter
    condition = self.build_lookup(lookups, col, value)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/sql/query.py", line 1084, in build_lookup
    lookup = lookup_class(lhs, rhs)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/lookups.py", line 18, in __init__
    self.rhs = self.get_prep_lookup()
File "/usr/local/lib/python3.5/dist-packages/django/db/models/lookups.py", line 68, in get_prep_lookup
    return self.lhs.output_field.get_prep_value(self.rhs)
File "/usr/local/lib/python3.5/dist-packages/django/db/models/fields/__init__.py", line 947, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: ''

任何帮助或想法都将不胜感激,这真的让我摸不着头脑。

共有1个答案

楚畅
2023-03-14

吉列尔莫·查莫罗和口袋国王都在这里为我找到了陷阱。在我的 views.py 截图中发布的(看似不相关的)逻辑块中,是以下代码:

if (request.is_ajax()):
    latest_line_id = request.GET.get('latest_id', '')
    if latest_line_id == '-1': # Return all lines
        json_data = serializers.serialize("json", list(reversed(Line.objects.filter(channel=channel).order_by('-id')[:100])))
    else:
        json_data = serializers.serialize("json", list(reversed(Line.objects.filter(id__gt=latest_line_id, channel=channel).order_by('-id')[:100])))
    return HttpResponse(json_data, content_type="application/json")

尽管在逻辑上从未被调用,但这两个响应程序都是正确的,因为<code>ValueError</code>失败源于Django,尽管如此,它们仍然试图计算<code〕json_data</code>。

如果latest_line_id为空(就像在POST请求中一样),它将被设置为",这将在尝试基于此ID的数据库查询时触发Django的ValueError。这可以通过尝试在Django shell中自己查询过滤器来证明(通过使用$python shell)manage.py:

(注意:如果使用django shell,不要忘记从

>>> list(Line.objects.filter(channel="test").filter(id__lte='').order_by('id'))
Traceback (most recent call last):
...
ValueError: invalid literal for int() with base 10: ''

吸取了教训,编辑视图时要非常勤奋,记得仔细检查所有逻辑块,阅读回溯时要小心(一双额外的眼睛可以帮助;))。希望我的疏忽可以节省别人失去的时间。

 类似资料:
  • 我正在使用创建通知。根据我的文件: 在我的< code>urls.py中。我通过在我的视图中使用它来生成测试通知。py: 我可以轻松获取此url中的未读通知数量: 它返回,如我所愿。但是使用我无法获取通知列表,我收到此错误: 作为我使用任何帮助将不胜感激。 完全回溯 环境: 请求方法:GET请求URL:http://127.0.0.1:8000/inbox/notifications/api/un

  • 给定一个有符号的32位整数x,返回其数字颠倒的x。如果反转x导致值超出有符号32位整数范围[-2**31, 2**31 - 1],则返回0。 假设环境不允许存储64位整数(有符号或无符号)。 这是我的意见书 int()方法应该允许我传递一个字符串值(“12”),但是它返回一个错误,说它是int()的无效文本。 第3行中的变量sp是str而不是float,所以我不知道为什么它不在leetcode提交

  • 问题内容: 我正在创建一个读取文件的程序,如果文件的第一行不为空白,它将读取接下来的四行。在这些行上执行计算,然后读取下一行。如果该行不为空,则继续。但是,我收到此错误: 它正在读取第一行,但无法将其转换为整数。 我该怎么做才能解决此问题? 代码: 问题答案: 仅作记录: 我在这里…

  • 问题内容: 我正在尝试做: 我得到以下错误: ValueError:以10为底的long()无效文字:‘12 .0’ 我的数据如下所示: 知道如何正确进行转换吗? 感谢帮助。 问题答案: 有一些值,无法将其转换为。 您可以使用并获得存在问题的价值: 如果需要检查值有问题的行,请与mask配合使用: 样品:

  • 问题内容: 每次尝试编码时,它都有效,但是当我键入代码时,出现错误: ValueError:int()以10为基的无效文字:“停止” 问题答案: 传递给的字符串应仅包含数字: 一个快速的解决方法是在此处使用异常处理: 而且您可以使用匹配“ stop”的任何大小写组合:

  • 问题内容: 我编写了一个程序来求解,然后将其投影在图形上。问题是,每当出现错误时: ValueError:int()以10为底的无效文字。 有什么建议? 这是回溯: 每当我输入一个小于1但大于0的数字时,就会出现问题。在此示例中为0.3。 这是我的代码: 问题答案: 您的回溯告诉您采用整数,您试图给出一个十进制数,因此您需要使用: 这应该按预期工作: 计算机以各种不同的方式存储数字。Python有