首页 > 解决方案 > Django URL 显示上一个和当前页面,但我只想要 URL 中的当前页面名称

问题描述

假设目前我在“http://127.0.0.1:8000/message/detailmessage/5”页面上,我想通过单击 base.html(导航栏)中的登录超链接进入“登录”页面,我希望它显示“http://127.0.0.1:8000/login”,但它显示“http://127.0.0.1:8000/message/detailmessage/login”我该怎么办?

base.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, shrink-to-fit=no"
    />
    <!-- Bootstrap CSS -->
    <link
      rel="stylesheet"
      href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css"
      integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
      crossorigin="anonymous"
    />
    <style>
    {% block css %}{% endblock %}
    </style>
    <title>{% block title %}{% endblock %}</title>
  </head>

  <body>
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
      <a class="navbar-brand" href="#">Home</a>
      <button
        class="navbar-toggler"
        type="button"
        data-toggle="collapse"
        data-target="#navbarNavDropdown"
        aria-controls="navbarNavDropdown"
        aria-expanded="false"
        aria-label="Toggle navigation"
      >
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarNavDropdown">
      {% for id in doctor %}
        {{id.doctor_id}}
    {% endfor %}
        <ul class="navbar-nav ml-auto">
         {% for id in doctor %}
        {{id.doctor_id}}
          <li class="nav-item">
            <a class="nav-link" href=message/{{id.doctor_id}}>Message</a>
          </li>
          {% endfor %}
          <li class="nav-item dropdown">
            <a
              class="nav-link dropdown-toggle"
              href="#"
              id="navbarDropdownMenuLink"
              data-toggle="dropdown"
              aria-haspopup="true"
              aria-expanded="false"
            >
              LogIn/LogOut
            </a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
              <a class="dropdown-item" href="login">Login</a>
              <a class="dropdown-item" href="/">Log Out</a>
            </div>
          </li>
        </ul>
      </div>
    </nav>
     {% block body %} {% endblock %}
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script
      src="https://code.jquery.com/jquery-3.2.1.slim.min.js"
      integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN"
      crossorigin="anonymous"
    ></script>
    <script
      src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
      integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
      crossorigin="anonymous"
    ></script>
    <script
      src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
      integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
      crossorigin="anonymous"
    ></script>
  </body>
</html>

消息.html

{% extends 'base.html' %} 
{% block css %} 
   
{% endblock %} 
{%block body %} 
    <h1>My Message Page</h1>
   
    <table class="table table-hover">
  <thead>
    <tr>
      <th scope="col">No</th>
      <th scope="col">Sender</th>
      <th scope="col">Message</th>
      <th scope="col">Action</th>
    </tr>
  </thead>
  <tbody>
    {% for message in message  %}
    <tr>
      <th scope="row">{{ forloop.counter }}</th>
      <td> {{message.sender}}</td>
      <td>{{message.message_text}}</td>
      <td><a href="detailmessage/{{message.messager_id}}">View</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
    {% load static %} 
{% endblock %}

详细信息.html

{% extends 'base.html' %} 
{% block css %} body {
  overflow-y:hidden;
}{% endblock %}
{%block body %}
<div class="container my-4 d-flex h-100">
  <div class="row align-self-center w-100">
    <div class="col-6 mx-auto">
      <div class="jumbotron">
        {% for message in message %}
        <h1 class="display-4">Title:{{message.message_title}}</h1>
        <p class="lead">Send By:{{message.sender}}</p>
        <p class="lead">{{message.message_text}}</p>
        <footer class="blockquote-footer">{{message.send_message}}</footer>
        <p class="lead">
          <button type="button" onclick="goBack()" class="btn btn-info my-4">
            Back
          </button>
        </p>
        {% endfor %}
      </div>
    </div>
  </div>
</div>
<script>
  function goBack() {
    window.history.back();
  }
</script>
{% load static %} 
{% endblock %}

视图.py

from django.shortcuts import render, redirect, HttpResponse
from django.contrib.auth  import authenticate,  login, logout
from django.contrib import messages 
from .models import Doctor, Message


# Create your views here.
def home(request):
    return render(request, 'home.html')

def login(request):
    print("before login is done")
    if request.method=="POST":
        # Get the post parameters
        username=request.POST['username']
        password=request.POST['password']
        print(username)
        if Doctor.objects.filter(username=username).exists():
            print("after username filter")
            print(username)
            if Doctor.objects.filter(password=password).exists():
                # messages.success(request, "Successfully Logged In")
                print("login is done")
                doctorid=Doctor.objects.filter(username=username)
                cnt = {'doctor': doctorid}
                return render(request,'home.html', cnt)
            else:
                messages.error(request, "Invalid credentials! Please try again")
                print("login is wrong")
                return redirect("/login")    
        else:
            messages.error(request, "Invalid credentials! Please try again")
            print("login is wrong")
            return redirect("/login") 
    return render(request,"login.html")

def message(request, id):
    print("messages are in this vieews")
    print(id)
    message = Message.objects.filter(receiver=id)
    cnt = {'message': message}
    print(message)
    return render(request, 'message.html', cnt)    

def detailmessage(request, id):
    message = Message.objects.filter(messager_id=id)
    print(message)
    cnt = {'message': message}
    return render(request, 'detailmessage.html', cnt)

网址.py

from django.urls import path

from . import views

app_name = 'msg'
urlpatterns = [
    path('home', views.home, name='home'),
    path('message/<int:id>', views.message, name='message'),
    path('message/detailmessage/<int:id>', views.detailmessage, name='detailmessage'),
    path('login', views.login, name='login'),
]

http://127.0.0.1:8000/message/detailmessage/5 图片

http://127.0.0.1:8000/message/detailmessage/登录图片

标签: htmldjango

解决方案


在您的模板上,使用 this<a class="dropdown-item" href="{% url 'login' %}">Login</a>而不是 this :<a class="dropdown-item" href="login">Login</a>

检查https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#url


推荐阅读