Как перенаправить на другую страницу, используя кнопку отправки - PullRequest
0 голосов
/ 15 апреля 2020

Я пишу представление, которое извлекает ответ из игры 2. html, проверьте ответ; если ответ правильный, представление перенаправит пользователя на исправление. html, если ответ неправильный, то пользователь будет перенаправлен на неверный. html.

Проблема теперь в том, что после нажатия кнопки отправки пользователь не будет перенаправлен. Но счет обновляется.

После того, как я нажму кнопку отправки, URL изменится с http://localhost: 8000 / game2 / на http://localhost: 8000 / game2 /? Ans2 = 4 & game2Answer = Отправить вместо перенаправления на исправление. html или неверно. html

Я думаю, это может быть проблема с моей кнопкой отправки, которая не вызывает функцию перенаправления, или проблема в том, как я пишу функцию перенаправления в представлениях, так как счет фактически обновляется, если ответ правильный.

Итак, как я могу исправить это, чтобы он мог перенаправить на любой правильный. html или неверно. html после перехода в оператор if-else.

morse_logs / views.py

@login_required()
def game2(request):
    """The Game2 page"""
    if request.user and not request.user.is_anonymous:
        user = request.user

    def verifyGame2(val1):
        user_score, created = userScore.objects.get_or_create(user=user)

        if val1 == 4:
            # user's score declared in model increase 5points
            # display correct and 5 points added to user
            user_score.score += 5
            user_score.save()
            return redirect('morse_logs:incorrect')
        else:
            # user's score declared in model has no point
            # display incorrect and 0 point added to user
            return redirect('morse_logs:incorrect')


    ans2 = request.GET.get('ans2', '')
    if ans2 == '':
        ans2 = 0

    verifyGame2(int(ans2))

    return render(request, 'morse_logs/game2.html')

game2. html

{% extends "morse_logs/base.html" %}

{% block content %}
    <title>GAME 2</title>
<div>
    <h1>GAME 2</h1>
    <h2>2 + 2 = ?</h2>
    <form action="" method="post" >
        <input type="number" id="ans1" name="ans1"/><br><br>
        <input type="submit" name="game1Answer"/>
    </form>
</div>
{% endblock content %}

morse_logs / правильные. html

{% extends "morse_logs/base.html" %}

{% block content %}
    <title>Correct!</title>
<div>
    <h1>Congratulations! Your answer is CORRECT!</h1>
</div>
{% endblock content %}

morse_logs / неправильные. html

{% extends "morse_logs/base.html" %}

{% block content %}
    <title>Inorrect...</title>
<div>
    <h1>Unfortunately! Your answer is Incorrect!</h1>
</div>
{% endblock content %}

morse_logs / urls.py


from django.urls import path, include
from morse_logs import views

app_name = 'morse_logs'

urlpatterns = [
    #The path() function is passed four arguments, two required: route and view, and two optional: kwargs, and name.
    # Home Page
    path(r'', views.index, name='index'),
    # Page that shows all topics
    path(r'topics/', views.topics, name='topics'),
    path(r'cipher/', views.cipher, name='cipher'),
    path(r'decipher/', views.decipher, name='decipher'),
    path(r'tutorialIndex/', views.tutorialIndex, name='tutorialIndex'),
    path(r'gameDirectory/', views.gameDirectory, name='gameDirectory'),
    path(r'game1/', views.game1, name='game1'),
    path(r'game2/', views.game2, name='game2'),
    path(r'correct/', views.correct, name='correct'),
    path(r'incorrect/', views.incorrect, name='incorrect'),
]

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Во-первых, я изменил метод формы шаблона с «GET» на «POST» и добавил {% csrf_token%}.

Во-вторых, я изменил представление на 2 части:

1st часть, когда пользователь впервые вводит game2. html (запрос GET), он будет отображать game2. html пользователю.

2-я часть - это в основном то, что я делал раньше, но на этот раз я добавил случай, который отвечает на запрос пользователя POST, и оттуда делать перенаправления либо для исправления. html, либо для неправильного. html

game2. html

{% extends "morse_logs/base.html" %}

{% block content %}
    <title>GAME 2</title>
<div>
    <h1>GAME 2</h1>
    <h2>2 + 2 = ?</h2>
    <form method="POST">
        {% csrf_token %}
        <input type="number" id="ans2" name="ans2"/><br><br>
        <input type="submit" name="Submit"/>
    </form>
</div>
{% endblock content %}

views.py

@login_required()
def game2(request):
    """The Game2 page"""
    if request.method == "GET":
        return render(request, 'morse_logs/game2.html')
    elif request.method == "POST":
        if request.user and not request.user.is_anonymous:
            user = request.user

        user_score, created = userScore.objects.get_or_create(user=user)

        ans2 = request.POST.get('ans2', '') #fetch the POST data from template
        if ans2 == '':
            ans2 = 0

        ans2 = int(ans2)
        if ans2 == 4:
            # user's score declared in model increase 5points
            # display correct and 5 points added to user
            user_score.score += 5
            user_score.save()
            return redirect(reverse('morse_logs:correct'))
        else:
            # user's score declared in model has no point
            # display incorrect and 0 point added to user
            return redirect(reverse('morse_logs:incorrect'))
0 голосов
/ 15 апреля 2020

Вы должны изменить перенаправление

('morse_logs: неверно. html')

на

редирект (' url_name ')

А также удалите имя_приложения, если вы используете django версия> 2.0

...