python - Django 2.2 错误:int() 参数必须是字符串、类似字节的对象或数字,而不是“列表”
问题描述
我正在使用 Django 2.2 构建一个 url-shortening 应用程序。
模型.py:
from django.db import models
from django.urls import reverse
import string
# Create your models here.
_char_map = string.ascii_letters+string.digits
def index_to_char(sequence):
return "".join([_char_map[x] for x in sequence])
class Shortener(models.Model):
link = models.URLField()
# date created
created = models.DateTimeField(auto_now_add=True)
# number of hits
hits = models.IntegerField(default = 0)
def __repr__(self):
return "<Link (Hits %s): %s>"%(self.hits, self.link)
def get_short_id(self):
_id = self.id
digits = []
while _id > 0:
rem = _id % 62
digits.append(rem)
_id /= 62
digits.reverse()
# This is where the error possibly is
out = []
for x in list(digits):
try:
out.append(int(digits))
except ValueError:
out.append(digits)
return out
@staticmethod
def decode_id(string):
i = 0
for c in string:
i = i * 64 + _char_map.index(c)
return i
视图.py:
def home_view(request):
url_error = False
url_input = ""
shortened_url = ""
if request.method == "POST":
validator = URLValidator()
try:
url_input = request.POST.get("url", None)
if not url_input:
url_error = True
else:
validator(url_input)
except ValidationError:
url_error = True
if not url_error:
link_db = Shortener()
link_db.link = url_input
link_db.save()
shortened_url = request.build_absolute_uri(link_db.get_short_id())
url_input = ""
#shortened_url = "%s/%s"%(request.META["HTTP_HOST"], link_db.get_short_id())
return render(request, "api/index.html", context = {"error":url_error, "url":url_input, "shorturl":shortened_url})
def link_view(request, id):
db_id = Shortener.decode_id(id)
print(db_id)
link_db = get_object_or_404(Shortener, id=db_id)
models.Shortener.objects.filter(id=db_id).update(hits=F('hits')+1) # Update the link hits
if not models.HitsDatePoint.objects.filter(link=link_db, day=datetime.date.today()).exists():
x = models.HitsDatePoint()
x.day = datetime.date.today()
x.link = link_db
x.save()
models.HitsDatePoint.objects.filter(day=datetime.date.today(), link=link_db).update(hits=F('hits')+1)
return redirect(link_db.link)
当我尝试运行应用程序时,我得到一个运行时错误int() 参数必须是字符串、类似字节的对象或数字,而不是 'list'。似乎错误指向 Shortener 类中的out列表。
我该如何解决这个错误?
解决方案
错误消息基本上解释了它,您不能将 int() 函数应用于整个列表。但是,您可以将 int() 应用于列表中的单个项目。如果您需要将“数字”列表作为整数列表,请尝试
for i in range(len(digits)):
digits[i] = int(digits[i])
注意,如果要一个一个地改变列表中的项,不能使用迭代方法for x in list(digits):
,必须按增量迭代,for i in range(len(digits)):
然后取列表中的每一项digits[i] = int(digits[i])
推荐阅读
- flutter - 使用提供程序包,如何管理在同一页面中调用 tow 方法的单个 bool
- python - Kivy 和 Kivmob:参考错误 - 每周参考错误不再存在
- bazel - 如何在不使用相对路径的情况下从另一个规则访问 bazel 规则的输出?
- javascript - 如果 Modal 已关闭,则清除 Input type file Value 并应禁用 Save All changes 按钮
- post - 邮递员 GET 请求 Binance API
- javascript - 使用redux打开状态时Material-ui对话框闪烁
- amazon-web-services - 从 EKS 集群中启用 Istio 的 pod 连接到 redis 实例
- java - 如何配置 Java 应用程序以使用 OAUTH2 使用 Gmail 服务发送电子邮件?
- json - Swift 如何将 jsonString 转换为 Dictionary 和 Array[Dictionary]
- python - 汉宁窗带宽