【问题标题】:How to return the result on same page in django?如何在 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”

【问题讨论】:

    标签: django django-views django-templates


    【解决方案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 模板要进行哪些更改!抱歉,我是初学者。
          猜你喜欢
          • 2018-08-09
          • 1970-01-01
          • 2012-06-24
          • 2015-11-26
          • 1970-01-01
          • 2014-03-11
          • 2014-05-06
          • 2014-03-10
          • 1970-01-01
          相关资源
          最近更新 更多