如何在 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

重定向/返回到Django中的相同(上一个)页面?

Django:如何在 ajax 中返回模型表单集并在模板中使用

如何在新页面中显示 django 搜索结果

django在view返回结果没问题是中文,在模板返回的是unicode编码为啥