Я создаю приложение для сокращения 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.
Как исправить эту ошибку?