Django 2.2错误:int()参数必须是字符串、类似字节的对象或数字,而不是“列表”

2024-06-01 04:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Django 2.2构建一个url缩短应用程序

型号.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列表

enter image description here

如何修复此错误


Tags: selfidurlinputdbstringreturnmodels
1条回答
网友
1楼 · 发布于 2024-06-01 04:34:18

错误消息基本上解释了这一点,即不能将int()函数作为一个整体应用于列表。但是,您可以将int()应用于列表中的单个项。如果您需要列表“digits”是一个整数列表,请尝试

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])

相关问题 更多 >