【发布时间】:2021-10-20 19:14:47
【问题描述】:
我想要做的是阻止经过身份验证的用户访问注册页面。这是我写的。
def validate_request(request):
if request.user.is_authenticated and request.user.is_active:
print("Condition approved")
return redirect("home:home")
def signup_view(request):
validate_request(request)
if request.method == "POST":
form = StudentUserSignupForm(request.POST)
if form.is_valid():
user = form.save()
login(request, user)
return redirect("https://google.com"). #TODO: Replace it
else:
redirect("home:home")
else:
print("Got some other method: ", request.method)
form = StudentUserSignupForm()
context = {
"form": form,
}
return render(request, "signup_login_form.html", context=context)
当我测试并创建一个新用户时,它会成功创建并且重定向正常。但是,创建的新用户仍然可以访问注册页面。
我在 validate_request 函数内的重定向函数调用中添加了一些快速打印语句,输出为
<HttpResponseRedirect status_code=302, "text/html; charset=utf-8", url="/">
它试图检查的 URL 已经存在并且是正确的。
我将重定向替换为https://google.com 而不是home:home,它仍然给出了相同的响应。
尝试的第三件事是在调用signup_view 函数后立即重定向。内部重定向和重定向到 Google 的相同响应也失败了。
我已经被这个问题困扰了一段时间。我已经回答了类似问题,但这些似乎对我没有帮助。
更多可能有用的细节
项目结构是
Website
|
'->Website
'->urls.py
'-> ...
'-> ...
'->Users
'-> urls.py
'->Home
'-> urls.py
Website/urls.py的内容是
urlpatterns = [
path('mdeditor/', include('mdeditor.urls')),
path('admin/', admin.site.urls),
path('', include("Home.urls")),
path('u/', include('Users.urls')),
]
urlpatterns += staticfiles_urlpatterns()
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Users/urls.py的内容是
app_name = "students"
urlpatterns = [
path('signup/', signup_view, name="signup"),
path('login/', login_view, name="login"),
]
home/urls.py的内容是
app_name = "home"
urlpatterns = [
path('', home_view, name="home")
]
Python==3.8.2 Django==3.2.6
我不知道我在这里缺少什么。如果你们能在这里指出我的错误,那将非常有帮助。
【问题讨论】:
-
在使用
login函数之前必须先对用户进行身份验证 -
@AmandeepSingh 未经身份验证的用户应该能够访问注册页面。经过身份验证的用户不应该这样做。
-
@PranavaMohan 该功能是关于注册用户的。我已经覆盖了函数
form.save(),它首先将学生标记为活动,并在登录用户之前在数据库中填写其他必要的详细信息。可能也应该在此处添加该功能。 -
为什么不在模板中根据用户是否注册来渲染注册按钮呢?此外,登录用户看到注册按钮也不常见!
-
@SANGEETHSUBRAMONIAM singup 按钮未向已登录的用户显示。我已经在模板中处理了它。但是用户仍然可以通过 URL 直接访问表单,或者通过浏览器转到上一页。
标签: python django django-views