提交表单后,Django POST请求重定向到空URL

时间:2018-08-13 03:50:46

标签: python django forms views

我有一个具有POST方法的登录表单,提交登录数据时,它会直接转到空url,并且不会在views.py中执行登录方法。理想情况下,当我通过“提交”按钮在 www.url.com/login 中提交表单后,它应该返回HttpResponse,但是,却带我到了 www.url.com / >

我是Django的新手,如果您可以研究它,我将不胜感激。谢谢!

home.html

from threading import Thread

def process(data):
    print(f"processing {data}")

l= ["data1", "data2", "data3"]

for task in l:
    t = Thread(target=process, args=(task,))
    t.start()

urls.py

    <center><h1>Welcome to my website</h1>
    <form method='POST'> {% csrf_token %}
    {{ form }}
    <button type='submit' class='btn btn-default'>Submit</button>
    </form>
    </center>

forms.py

from django.contrib import admin
from django.urls import path

from .views import home, login

urlpatterns = [
    path('', home),
    path('login/', login),
    path('admin/', admin.site.urls),
]

views.py

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(widget=forms.TextInput(attrs={"class":"form-control", "placeholder":"Your username"}))
    password = forms.CharField(widget=forms.PasswordInput(attrs={"class":"form-control", "placeholder":"Your password"}))

4 个答案:

答案 0 :(得分:2)

首先,您应以设置要发送网址的形式设置属性action

第二,必须清除实际使用的url值。这不是Django的问题,而是HTML。 我建议您使用absolute path。如果您使用relative path,则每当您发送请求时,都会添加一个斜杠字符串。

<form action="/login/" method='POST'>
  {% csrf_token %}
  {{ form }}
  <button type='submit' class='btn btn-default'>Submit</button>
</form>

答案 1 :(得分:1)

这是因为您的表单不包含action,即使用用户凭据进行POST调用的地方。

尝试在home.html中进行以下更改:

<center><h1>Welcome to my website</h1>
<form action="" method='POST'> {% csrf_token %}
{{ form }}
<button type='submit' class='btn btn-default'>Submit</button>
</form>
</center>

答案 2 :(得分:1)

在回答完之前,最好使用命名模式而不是固定的url。

# urls
...
path('login/', login, name='login'),
...

# template
<form action="{% url 'login' %}" method='POST'>

因此,如果您进行更改

login/

accounts/login/

您也不必更改模板。

答案 3 :(得分:0)

urlpatterns = [
    re_path('^$', home_page),
    re_path('^admin/', admin.site.urls),
    re_path('^register/$', register_page, name='register'),
    re_path('^login/$', login_page, name='login'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

我通过在模式的开头和结尾添加^$来解决了这个问题。