zoukankan      html  css  js  c++  java
  • django 路由控制之反向解析

    在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。

    人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

    在需要URL 的地方,对于不同层级,Django 提供不同的工具用于URL 反查:

    • 在模板中:使用url 模板标签。
    • 在Python 代码中:使用from django.urls import reverse()函数

    反向解析第一种方法:

     

    login.html

    利用django 模板url 渲染  去找对应的name对应url 匹配住对应url 渲染到页面

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    </head>
    <body>
        <form action="{% url 'logins' %}" method="post">
            用户名<input type="text" name="username">
            密码<input type="password" name="password">
            <input type="submit">
        </form>
    </body>
    </html>

    urls.py

    起个别名 url name=""  利用name 找对应url

    from django.contrib import admin
    from django.urls import path, re_path, include
    
    from app01 import views
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path("login/", views.login, name="logins"),
    
        # 分发
        re_path(r"^", include("app01.urls")),
    
    
    ]

    views.py

    from django.shortcuts import render, HttpResponse
    
    # Create your views here.
    
    def login(request):
    
        if request.method == "GET":
            return render(request, "login.html")
    
        elif request.method == "POST":
    
            username = request.POST.get("username")
            password = request.POST.get("password")
    
            if username == "mike" and password == "123":
                return HttpResponse("登录成功")
            else:
                return HttpResponse("用户名或者密码错误")

    url 模板 另外一种写法

    <a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
    
    <ul>
    {% for yearvar in year_list %}
    <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
    {% endfor %}
    </ul>

     当命名你的URL 模式时,请确保使用的名称不会与其它应用中名称冲突。

    如果你的URL 模式叫做comment,而另外一个应用中也有一个同样的名称,当你在模板中使用这个名称的时候不能保证将插入哪个URL。

    在URL 名称中加上一个前缀,比如应用的名称,将减少冲突的可能。我们建议使用myapp-comment 而不是comment

    反向解析第二种方法

    
    

    在python中:

    from django.urls import reverse
    from django.http import HttpResponseRedirect
    
    def redirect_to_year(request):
        # ...
        year = 2006
        # ...
        return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))   # 同redirect("/path/")

    django 路由控制之反向解析 python中方法 

  • 相关阅读:
    20155323 2016-2017-2 《Java程序设计》第7周学习总结
    20155323刘威良第一次实验 Java开发环境的熟悉(Linux + IDEA)
    20155323 2016-2017-2 《Java程序设计》第6周学习总结
    20155323 2016-2017-2 《Java程序设计》第5周学习总结
    20155323 2016-2017-2 《Java程序设计》第4周学习总结
    20155323 2016-2017-2 《Java程序设计》第3周学习总结
    20155323 2016-2017-2 《Java程序设计》第2周学习总结
    20155323 2016-2017-2 《Java程序设计》第一周学习总结
    20155320 2016-2017-2 《Java程序设计》第六周学习总结
    20155320 2016-2017-2 《Java程序设计》第五周学习总结
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/14190358.html
Copyright © 2011-2022 走看看