Django POST 请求在提交表单后重定向到空 url
Django POST request redirects to empty url after submitting form
我有一个使用 POST 方法的登录表单,当我提交登录数据时,它直接进入空 url 并且不执行 views.py 中的登录方法.理想情况下,在我通过提交按钮在 www.url.com/login 中提交表单后,它应该 return 一个 HttpResponse 但相反,它需要我 www.url.com/
我是 Django 的新手,如果您能研究一下,我将不胜感激。谢谢!
home.html
<center><h1>Welcome to my website</h1>
<form method='POST'> {% csrf_token %}
{{ form }}
<button type='submit' class='btn btn-default'>Submit</button>
</form>
</center>
urls.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),
]
forms.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"}))
views.py
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from django.shortcuts import render
from .forms import LoginForm
def home(request):
context={
"form": "Test"
}
return render(request, "home.html", context)
def login(request):
login_form = LoginForm(request.POST or None)
context={
"form": login_form
}
if login_form.is_valid():
username = login_form.cleaned_data.get('username')
password = login_form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
#request.user.is_authenticated()
login(request, user)
return HttpResponse("You are now logged in")
else:
return HttpResponse('Error')
return render(request, "home.html", context)
这是因为您的表单不包含 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>
首先,您应该在设置 url 发送的表单中设置属性 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>
根据之前的回答,使用命名模式而不是固定 url 是一个很好的做法。
# urls
...
path('login/', login, name='login'),
...
# template
<form action="{% url 'login' %}" method='POST'>
所以如果你改变例如
login/
为了
accounts/login/
您也不必更改模板。
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)
我通过在模式的开头和结尾添加 ^$
解决了这个问题。
我有一个使用 POST 方法的登录表单,当我提交登录数据时,它直接进入空 url 并且不执行 views.py 中的登录方法.理想情况下,在我通过提交按钮在 www.url.com/login 中提交表单后,它应该 return 一个 HttpResponse 但相反,它需要我 www.url.com/
我是 Django 的新手,如果您能研究一下,我将不胜感激。谢谢!
home.html
<center><h1>Welcome to my website</h1>
<form method='POST'> {% csrf_token %}
{{ form }}
<button type='submit' class='btn btn-default'>Submit</button>
</form>
</center>
urls.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),
]
forms.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"}))
views.py
from django.contrib.auth import authenticate, login
from django.http import HttpResponse
from django.shortcuts import render
from .forms import LoginForm
def home(request):
context={
"form": "Test"
}
return render(request, "home.html", context)
def login(request):
login_form = LoginForm(request.POST or None)
context={
"form": login_form
}
if login_form.is_valid():
username = login_form.cleaned_data.get('username')
password = login_form.cleaned_data.get('password')
user = authenticate(request, username=username, password=password)
if user is not None:
#request.user.is_authenticated()
login(request, user)
return HttpResponse("You are now logged in")
else:
return HttpResponse('Error')
return render(request, "home.html", context)
这是因为您的表单不包含 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>
首先,您应该在设置 url 发送的表单中设置属性 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>
根据之前的回答,使用命名模式而不是固定 url 是一个很好的做法。
# urls
...
path('login/', login, name='login'),
...
# template
<form action="{% url 'login' %}" method='POST'>
所以如果你改变例如
login/
为了
accounts/login/
您也不必更改模板。
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)
我通过在模式的开头和结尾添加 ^$
解决了这个问题。