Django Ошибка 2.2: аргумент int () должен быть строкой, байтовым объектом или числом, а не списком - PullRequest
0 голосов
/ 09 мая 2020

Я создаю приложение для сокращения URL-адресов, используя Django 2.2.

models.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

views.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 () должен быть строкой, байтовым объектом или числом, а не списком . Похоже, ошибка указывает на список out в классе Shortener.

enter image description here

Как исправить эту ошибку?

1 Ответ

0 голосов
/ 09 мая 2020

Сообщение об ошибке в основном объясняет это, вы не можете применить функцию 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])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...