Когда я голосую за один из вариантов, он показывает ошибку (можно только объединить str (не int) с str) - PullRequest
1 голос
/ 08 мая 2020

enter image description here

Я следую Django официальному руководству по документации, чтобы создать приложение для опроса. В настоящее время я застрял на части 4. Поэтому, когда я выбираю один из вариантов, он показывает ошибку:

может только объединить str (не "int") с str

Я не могу понять. Я пытаюсь добавить строку к целому числу, в чем проблема в коде?

Вот мой код:

views.py

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from .models import Choice, Question


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)


def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})


def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})


def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

urls.py

from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
    path('', views.index, name='index'),
    path('<int:question_id>/', views.detail, name='detail'),
    path('<int:question_id>/results/', views.results, name='results'),
    path('<int:question_id>/vote/', views.vote, name='vote'),
]

models.py

import datetime
from django.db import models
from django.utils import timezone


class Question(models.Model):
    question_text = models.CharField(max_length=250)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Вы пытаетесь объединить целое число со строкой. Как говорится в трассировке, ошибка находится в строке 34, строка 34:

selected_choice.votes += 1

Вы можете прокомментировать эту строку и попытаться сначала проверить, какое именно значение содержится в переменной :

print(selected_choice.votes)
print(type(selected_choice.votes))

(Затем проверьте вывод в командной строке)

1 голос
/ 08 мая 2020

Было бы лучше, если бы вы показали более точное описание ошибки; так вам будет легче помочь.

В любом случае, я полагаю, проблема здесь: selected_choice.votes += 1. Вероятно (я просто предполагаю из того, что вижу), selected_choice.votes имеет тип str; поэтому, когда вы пытаетесь добавить int значение 1, Python сообщает вам, что это can only concatenate str (not "int") to str.

Чтобы немного понять это сообщение, в Python строковые суммы являются строковыми конкатенации: 'hi' + ' I'm Rodrigo' == 'hi I'm Rodrigo'. По этой причине он понимает, что вы пытаетесь объединить строковое значение с целочисленным значением.

Убедитесь, что переменная, в которой вы храните количество голосов, является целым числом, или попробуйте преобразовать его в int, а затем обратно в str (я бы не рекомендовал это).

Надеюсь, что это поможет.

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