提交后多个POST请求不起作用

时间:2019-09-03 13:14:06

标签: django django-forms django-views

我正在尝试在单个页面中使用2种发布方法,一种用于登录,另一种用于与我们联系 登录工作正常,但提交联系我们后,登录和联系我们页面的内容消失了

我试图通过各种类型的字典,但是仍然无法正常工作

app / views.py

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from homePage.forms import SignInForm,DropUsaMessage
# Create your views here.
def homePage(request):

    if request.method == 'POST' and 'SignIn' in request.POST:
        sign_in_detail = SignInForm(request.POST)
        if sign_in_detail.is_valid():
            return render(request, "index2.html",{})
    elif request.method == 'POST' and 'SendMessage' in request.POST:
        message_detail = DropUsaMessage(request.POST)
        if message_detail.is_valid():
            return render(request, "index.html",{})
    else:
        sign_in_detail = SignInForm()
        message_detail = DropUsaMessage()

    context={
        "form":sign_in_detail,
        "forms":message_detail
            }
    return render(request, "index.html",context)

index.html

<div class="container contact-form">
              <form method="post">
                      <h3>Drop Us a Message</h3>


                              {% csrf_token %}
                              {{ forms }}<br><br>
                              <div class="form-group">
                                  <input type="submit" name="SendMessage" class="btnContact" value="Send Message" />
                              </div>



              </form>
      </div>
<div class="container-fluid">

        <div class="row">
          <div class="col-md-8">
            <img src="{% static 'img/sampleImage.jpg' %}" width="100%" height="100%" class="d-inline-block align-top" alt="">
          </div>
          <div class="col-md-4">
            <form method="POST">
              {% csrf_token %}
              {{ form }}
              <div class="form-check">
                  <span class="fpswd">Forgot <a href="#">password?</a></span>
              </div>
              <button type="submit" class="btn btn-primary" name="SignIn">Submit</button>
            </form>



          </div>
        </div>
      </div>

app / forms.py

from django import forms
from django.core import validators

class SignInForm(forms.Form):
    email=forms.EmailField(widget=forms.EmailInput(attrs={"class": 'form-control',"placeholder":'Enter E-mail',"id": 'exampleInputEmail1'}))
    password=forms.CharField(widget=forms.PasswordInput(attrs={"class":'form-control',"placeholder":'Enter Password',"id":'exampleInputPassword1'}))

class DropUsaMessage(forms.Form):
    name = forms.CharField(widget=forms.TextInput(attrs={"class":'form-control',"placeholder":'Your Name'}))
    email = forms.EmailField(widget=forms.EmailInput(attrs={"class": 'form-control',"placeholder":'Your E-mail',"id": 'exampleInputEmail1'}))
    phone = forms.IntegerField(widget=forms.NumberInput(attrs={"class":'form-control',"placeholder":'Your Phone Number'}))
    message = forms.CharField(widget=forms.Textarea(attrs={"class":'form-control',"placeholder":'Type Your Message',"style":'width:100%; height: 150px'}))

预期结果: 填写完联系我们表格后,该字段将存在。 实际结果: “联系我们”中没有任何字段(“发送消息”按钮除外),而SignInForm中没有任何字段(没有电子邮件,也没有密码)。

1 个答案:

答案 0 :(得分:1)

只需遵循代码流,您会注意到,在POST请求和帖子中为“ SignIn”的情况下,您返回的呈现的“ index2.html”模板没有任何上下文(form和{ {1}}将在您的模板中未定义)。对于另一种情况,同上:

forms

更糟糕的是,如果发布的表单无效,您会注意到您仅为表单定义了一个,而没有为另一个定义,因此当代码执行到达行return render(request, "index2.html", {}) # empty context 时,其中一个将是未定义的并且您的视图将“崩溃”,并返回500错误。

context = {"form": ..., "forms": ...}

通常,context = {'form': sign_in_detail, # sign_in_detail never defined for second "if" 'forms': message_detail} # message_detail never define for first "if" 成功后,您应该始终重定向到另一个视图(或同一视图)。这是互联网惯例,以避免页面重新加载的问题,该问题会重新提交相同的数据。这样做:

POST

此外,将表单发布到不同的视图(更改每个return redirect('home') # or whatever your homepage url pattern is called 标签的action属性)更有意义,因此您可以在单独的视图中处理它们,这是更简洁的代码:

<form>