如何在 django 的同一页面上返回结果?
Posted
技术标签:
【中文标题】如何在 django 的同一页面上返回结果?【英文标题】:How to return the result on same page in django? 【发布时间】:2015-01-04 02:09:45 【问题描述】:如何在 django 的同一页面上获取特定查询的结果? 例如,如果我的“index.html”有一个包含用户名和密码两个字段的表单。 在 views.py 中,我检查值是否与 db 中的字段匹配。 我想在同一页面返回一个字符串“登录成功”或“登录失败”。 请建议views.py 和index.html 的必要代码。 目前我检查值并呈现一个新页面。请建议如何在同一页面上返回它。 提前致谢!
def index(request):
return render(request, "index.html")
def stage2(request):
if Verify.objects.filter(usr=request.POST['us'],password=request.POST['pass'])
request.session['usr']=request.POST['us']
a=request.session['usr']
dict1='u':a
return render(request,"success.html",dict1)
else:
return render(request,"failed.html")
我想在同一页面上显示结果,即“index.html”
【问题讨论】:
【参考方案1】:项目的urls.py
urlpatterns = [
path('', include('accounts.urls')),
path('admin/', admin.site.urls)
]
账户模块的urls.py
urlpatterns = [
path('', views.userlogin, name='home'),
path('accounts/login', views.userlogin, name='login'),
path('accounts/add', views.add, name='add')
]
views.py
from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.models import User, auth
def userlogin(request):
if request.method == "POST":
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
return render(request, 'home.html', 'name': username)
else:
messages.info(request, 'Invalid Credentials')
# Going back to previous URL
return redirect(request.META['HTTP_REFERER'])
else:
return render(request, 'login.html')
def add(request):
n1 = int(request.POST["num1"])
n2 = int(request.POST["num2"])
res = n1 + n2
return render(request, 'result.html', 'result': res)
master.html
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
</head>
<body bgcolor="#ff1493">
% block content %
% endblock %
</body>
</html>
home.html
% extends 'master.html' %
% block content %
<b> Hello name </b>
<form action="add" method="post">
% csrf_token %
<table>
<tr>
<td>
Enter First Number :</td>
<td>
<input type="number" name="num1">
</td>
</tr>
<tr>
<td>
Enter Second Number :
</td>
<td>
<input type="number" name="num2">
</td>
</tr>
<tr>
<td></td>
<td> <input type="submit"> </td>
</tr>
</table>
</form>
% endblock %
登录.html
% load static %
<html>
<head>
<title> Analytics-login </title>
<link rel="stylesheet" type="text/css" href="% static 'styles/style.css' %">
<script src="% static 'js/jquery.min.js' %" charset="utf-8"></script>
<script type="text/javascript" src="% static 'js/login.js' %" charset="utf-8"></script>
</head>
<body>
<div class="login-box">
<img src="% static 'images/avatar.png' %" class="avatar">
<h1>Login</h1>
<div>
% if messages %
<ul class="messages">
% for message in messages %
<li% if message.tags % class=" message.tags "% endif %>
% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %Important: % endif %
message
</li>
% endfor %
</ul>
% endif %
</div>
<form action="accounts/login" method="post">
% csrf_token %
<div class="txtb">
<input type="text" name="username">
<span data-placeholder="Username" ></span>
</div>
<div class="txtb">
<input type="password" name="password">
<span data-placeholder="Password"></span>
</div>
<div >
<input type="submit" name="submit" value="Login">
</div>
<div class="bottom-text">
<a href="#" >Forget Password</a>
<a>|</a>
<a href="accounts/register" >Register</a>
</div>
</form>
</div>
</body>
</html>
【讨论】:
【参考方案2】:您可以使用 Django 消息。 访问https://docs.djangoproject.com/en/2.1/ref/contrib/messages/ 我已经给出了一个登录功能的例子。
在views.py中
class LoginView(View):
def post(self, request,*args, **kwargs):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
messages.success(request, 'woahh!! logged in..')
return redirect('home')
else:
return HttpResponse('please! verify your Email first')
else:
messages.error(request, 'username or password not correct')
return redirect('login')
在模板/login.html中
<form method="post"v action="% url 'login' %">
% csrf_token %
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
% for error in messages %
<p> error </p><br>
% endfor %
<button type="submit" >Login</button>
</form>
希望对你有帮助。
【讨论】:
【参考方案3】:这是一个你可以使用的简单方法:
def index(request):
return render(request, "index.html")
def stage2(request):
if Verify.objects.filter(usr=request.POST['us'],password=request.POST['pass'])
request.session['usr']=request.POST['us']
a=request.session['usr']
dict1='u':a
return render(request,"success.html",dict1)
else:
error = "Username or Password is Incorrect"
return render(request,"index.html",'error':error)
#Instead of rendering failed.html you can load index.html and pass error message to html page
在index.html中可以查看jinja模板中的错误信息
<html>
<body>
% if error %
error
% endif %
<input type="email">
<input type="password">
</body>
</html>
【讨论】:
【参考方案4】:使用return redirect(request.META['HTTP_REFERER'])
重定向到上一个网址。
【讨论】:
你能具体说明一下怎么做吗?还有在 django 模板中要做哪些更改。谢谢。 什么变化不是你的意思? 如果用户名和密码被验证,而不是新页面“success.html”,它只包含“用户验证”。我想让它显示在表单下方的同一页面“index.html”上。 你必须检查 django Message framework 来显示消息,通过link 做必要的步骤,在链接中提到 成功了!但它会重新加载整个页面吗?如果我将它用于帖子中的评论,它会重新加载整个页面吗??【参考方案5】:我想你正在寻找用户登录功能,你可以参考django用户登录here并且还使用django消息框架显示messages
from django.contrib.auth import authenticate, login
from django.shortcuts import redirect
def my_view(request):
username = request.POST['username']
password = request.POST['password']
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
# Return a 'disabled account' error message
return redirect('/')
else:
# Return a 'disabled account' error message
return redirect('/')
else:
# Return an 'invalid login' error message.
return redirect('/')
【讨论】:
不,实际上我想在其他格式中使用此方法,也像在页面中询问有四个选项的问题,选择一个并提交后,我想在同一页面上显示结果。所以你能帮我解决我当前views.py中的这类问题吗?谢谢:) 这样您就可以将 return render(request,"success.html",dict1) 和 return render(request,"failed.html") 替换为 return redirect(requst.META['HTTP_REFERER']) 但是 Django 模板要进行哪些更改!抱歉,我是初学者。以上是关于如何在 django 的同一页面上返回结果?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 php 中将“$_POST”返回到同一页面或不同的结果页面? [关闭]
Django:在现有的 html 页面上返回 StreamingHttpResponse