我有一个具有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"}))
答案 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)
我通过在模式的开头和结尾添加^$
来解决了这个问题。