【问题标题】:Why is my Django form posting again from the index page?为什么我的 Django 表单再次从索引页面发布?
【发布时间】:2017-08-02 19:26:29
【问题描述】:

我是 Django 新手,并且一直在学习一些印刷和在线教程来开始开发基本的 Web 应用程序。我已经达到了我所拥有的地步:

  • 索引页(模板)
  • 表格(模板)
  • 基本模型
  • 处理表单的视图函数
  • 所需的网址格式

我的表单允许我输入文件名并将其保存在数据库中。该表单有效,它将数据保存到数据库中,并将用户返回到索引页面。一切正常。

我的问题是这样的:

  1. 如果我在提交表单后返回到索引页面并在浏览器中点击刷新,它会尝试再次提交相同的数据,即使表单没有显示。
  2. 即使我可以看到索引页面内容,浏览器地址栏中的 URL 仍然有 add_media 表单的 URL。

这一切都很奇怪!这是一些代码:

index 和 add_media 的视图函数:

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from django.template.context_processors import request

from .forms import MediaForm
from .models import Media

# Create your views here.
@login_required
def index(request):

    media_list = Media.objects.order_by('title')
    context_dict = {'media': media_list}
    return render(request, 'media/index.html', context_dict)

@login_required
def add_media(request):
    form = MediaForm()

    if request.method == 'POST':
        form = MediaForm(request.POST)

        if form.is_valid():
            form.save(commit = True)

            return index(request)
        else:
            print(form.errors)

    return render(request, 'media/add_media.html', {'form': form})

这是表格:

from django import forms

from .models import Media

class MediaForm(forms.ModelForm):
    media = Media
    title = forms.CharField(max_length=50)

    class Meta:
        # Associate the ModelForm and the Model
        model = Media
        fields = ('title',)

模板:

{% extends 'base.html' %}

{% block title %}My Media Library{% endblock %}
{% block content %}
    <a href="/media/add_media/" id="id_add_media">Add Media</a> - <a href="/account/logout" id="id_logout">Logout</a>
    <h2 name="pagename">Home Page</h2>
    <div>
    {% if media %}
    <ul>
        {% for item in media %}
            <li>
                {{ item.title }}
            </li>
        {% endfor %}
    </ul>
    {% else %}
        <p>There is no media in the system at present</p>
    {% endif %}    


    </div>

{% endblock %}

add_media.html 模板:

{% extends 'base.html' %}

{% block title %}Add Media{% endblock %}

{% block content %}
  <h2>Add Media</h2>
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" value="Save Media" name="save">Save Media</button>
  </form>
{% endblock %}

网址:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'), 
    url(r'^index/$', views.index, name='index'), 
    url(r'^add_media/$', views.add_media, name="add_media"),
    ]

有人能告诉我为什么,当我在索引页面上点击刷新 (F5) 时,它会尝试重新发布 add_media 表单吗?

提前致谢

大卫

【问题讨论】:

    标签: django forms post


    【解决方案1】:

    在成功发布请求后,您应该重定向用户,以防止重复提交表单。目前,您正在呈现索引模板,而不是重定向到索引 url。将您的视图更改为:

    from django.shortcuts import redirect
    
    @login_required
    def add_media(request):
        form = MediaForm()
    
        if request.method == 'POST':
            form = MediaForm(request.POST)
    
            if form.is_valid():
                form.save(commit = True)
                return redirect('index')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 2021-11-10
      • 2015-09-03
      • 2016-09-16
      • 2017-09-30
      • 2022-01-07
      • 2023-03-03
      相关资源
      最近更新 更多