Как увеличить значение (нажав кнопку) в HTML-шаблон django, используя цикл for? - PullRequest
0 голосов
/ 22 февраля 2019

Я на самом деле программирую веб-сайт «Задай вопрос» для школьного проекта.Я следовал за первым этапом учебника по django с официального сайта, но сейчас я пытаюсь улучшить его сам.

Я добавил кнопку «голосовать» в каждый div (которые создаются в цикле for), которыйя хочу увеличить число просмотров views.vote.

Некоторый код будет более понятным.

Итак, вот мой файл detail.html, который показывает все мои вопросы и варианты / ответы на этот вопрос скнопка голосования для каждого выбора:

{% block content %}
    <h2>{{ question.question_text }}</h2>

    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

    <form action="{% url 'polls:vote' question.id %}" method="post">
        {% csrf_token %}
        {% for choice in question.choice_set.all %}
            <div class="choices">
                <label for="">{{ choice.choice_text }}</label><br>
                <p>{{ choice.votes }} vote{{ choice.votes|pluralize }}</p>
                <input type="submit" name="vote" id=""  value="Vote">
            </div>
        {% endfor %}
        <br>
    </form>
    <a href="{% url 'polls:choice' question.id %}">Add a choice</a>
{% endblock %}

А вот мое мнение. Голосование, которое дает правильный вопрос и (должно) получить правильное значение «голоса» для увеличения:

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST['vote'])
    except (KeyError, Choice.DoesNotExist):
        return render(request, 'polls/detail.html', {
            'question': question,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:detail', args=(question.id,)))

Мое значение «Голоса» объявлено в моем объекте «Выбор», как это:

class Choice(models.Model):
    votes = models.IntegerField(default=0)

На самом деле, когда я нажимаю кнопку «Голосовать», я получаю это сообщение об ошибке:

invalid literal for int() with base 10: 'Vote'

Я настоящий новичок в Джанго, так что будьте добры!

1 Ответ

0 голосов
/ 22 февраля 2019

Ваша ошибка в строке:

<input type="submit" name="vote" id=""  value="Vote">

Поскольку вы используете

selected_choice = question.choice_set.get(pk=request.POST['vote'])

В результате request.POST['vote'] вернет «Голосование».Это потому, что он выбирает значение <input>, которое определено как value="Vote", но для вашего оператора представления требуется целочисленное значение.

Для решения вашей проблемы вам нужно передать идентификатор выбора в полеvalue поле типа:

<input type="submit" name="vote" id=""  value="{{ choice.id }}">

Я бы рекомендовал вам использовать button вместо input как:

<button type="submit" name="vote" id=""  value="{{ choice.id }}">Vote</button>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...