【问题标题】:Django: url in "form action" doesn't workDjango:“表单操作”中的 url 不起作用
【发布时间】:2017-11-30 14:05:43
【问题描述】:

详细.html:

<form id="answer_form" class="form-horizontal" action="{% url 'puzzle:update' puzzle.id %}" method="POST" onSubmit="return ValidateAnswer();">
    {% csrf_token %}
    <p>Please entry your answer below: (Case insensitive)</p>
    <div class="form-group col-xs-12">
        <input id="player_answer" maxlength="30" name="player_answer" type="text">
    </div>
    <div class="form-group col-xs-12">
        <button id="submit_answer_btn" class="btn btn-success" type="submit">Submit</button>
    </div>
</form>

<script>
function ValidateAnswer() {
    var player_answer = document.getElementById("player_answer");
    if(player_answer.value == {{ puzzle.answer }}) {
        alert("Congratulations!");
    } else {
        alert("Wrong answer!");
        return false;
    }
}
</script>

在 url.py 中

app_name = 'puzzle'

urlpatterns = [
    url(r'^(?P<pk>[0-9]+)/$', login_required(views.PuzzleDetailView.as_view()), name='detail'),
    url(r'^(?P<puzzle_id>[0-9]+)/update/$', views.update_user_game_history, name='update'),
]

在views.py中

class PuzzleDetailView(DetailView):
    model = Puzzle
    template_name = 'puzzle/detail.html'


def update_user_game_history(request, puzzle_id):
    player_game_history = PlayerGameHistory.objects.get(user=request.user)
    solved_puzzle = Puzzle.objects.get(id=puzzle_id)
    player_game_history.score += solved_puzzle.point
    player_game_history.save()
    return HttpResponseRedirect('/')

我要做的是点击 Submit 按钮,通过第二个 url,转到 views.py 中的 update_user_game_history 功能。

但是,每次我提交时,流程都会尝试通过第一个 url 转到 PuzzleDetailView。我得到 Method Not Allowed (POST): /2/ in terminal

【问题讨论】:

  • 请显示ValidateAnswer() javascript函数的代码。
  • 呈现的表单标签是什么样的(点击浏览器中的查看源代码)。你的{% url %} 标签对我来说看起来不错。确保您已保存所有打开的文件并重新启动服务器,以确保您确实在运行您认为的代码。

标签: django forms post


【解决方案1】:

我不确定这是否解决了您的问题,但基本上在您看来,您无法确保该方法是否为“POST”。为了解决这个问题,您可以在代码中添加这一行:

def update_user_game_history(request, puzzle_id):
    if request.method == 'POST':
        player_game_history = PlayerGameHistory.objects.get(user=request.user)
        solved_puzzle = Puzzle.objects.get(id=puzzle_id)
        player_game_history.score += solved_puzzle.point
        player_game_history.save()
        return HttpResponseRedirect('/')

但是根据您的示例,没有必要调用表单,因为您没有使用它。我的建议是改进这个视图,因为只有一个 url 你才能得分多次

【讨论】:

  • @jiyi 很高兴能帮到你,喜欢或采纳别忘了点赞
【解决方案2】:

非常感谢阿拉斯代尔。检查呈现的表单标签后,我发现了问题。表单标签中的 action 属性值错误。它仍然是“#”。 Chrome 后退按钮似乎没有从服务器检索最新页面。它只会重新加载之前收到的内容。

【讨论】:

    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2018-09-19
    相关资源
    最近更新 更多