V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ltoddy
V2EX  ›  Python

Django 模板 url 如何构造请求参数

  •  
  •   ltoddy ·
    ltoddy · 2018-11-16 07:27:10 +08:00 · 5129 次点击
    这是一个创建于 2184 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如在 urls.py 中有一个视图函数: path("/index", view.index, name="index")

    在 Django 模板那边可以用 {% url "index" %} 把这个 url (/path/index )生成。

    我想问一下,假设我想生成的 url 附加 GIT 请求参数,例如: /path/index?foo=bar, 那我 Django 模板那边的 url 该怎么写?

    26 条回复    2020-12-28 19:54:32 +08:00
    iiduce
        1
    iiduce  
       2018-11-16 08:09:01 +08:00
    这个是最基本的,看一下官方文档。
    chengxiao
        2
    chengxiao  
       2018-11-16 08:11:28 +08:00
    {% url "index" %}/?foo=bar ,不过记得官方并不推荐这种写法 ,"/path/index/foo/bar/",一般是这样写
    hzwjz
        3
    hzwjz  
       2018-11-16 08:15:15 +08:00 via Android
    不用生成的,想获取 foo 的值,可以这样子 request.Get.get('foo')。
    ltoddy
        4
    ltoddy  
    OP
       2018-11-16 08:18:05 +08:00
    @iiduce 文档里要是有,我还问这个问题干嘛.
    ltoddy
        5
    ltoddy  
    OP
       2018-11-16 08:18:41 +08:00
    @hzwjz 你看清楚我问的呀, 我问的是 django 模板那边怎么构造请求参数, 不是视图函数那边怎么取到请求参数.
    ltoddy
        6
    ltoddy  
    OP
       2018-11-16 08:19:14 +08:00
    @chengxiao 对,我现在就是用这个方案解决的, 这个方案太 ugly 了.
    rockdodos
        7
    rockdodos  
       2018-11-16 08:30:14 +08:00
    url.py:path("/index/<str:foo>", view.index, name="index")
    templates:{% url "index" bar %}
    wonderay
        8
    wonderay  
       2018-11-16 08:32:55 +08:00
    {% url 'some-url-name' arg1=v1 arg2=v2 %}

    官方文档里没有么???还是你根本不看
    https://docs.djangoproject.com/en/2.1/ref/templates/builtins/#url

    google 一下也很快会得到答案
    https://stackoverflow.com/questions/25345392/how-to-add-url-parameters-to-django-template-url-tag
    还那么理直气壮的怼回复的人
    ltoddy
        9
    ltoddy  
    OP
       2018-11-16 08:48:41 +08:00 via Android
    @wonderay 我试过了,不行的,模板那边报错的。
    ltoddy
        10
    ltoddy  
    OP
       2018-11-16 08:54:43 +08:00 via Android
    @wonderay 我要的是 url 的请求参数,又不是动态路由的参数。
    hellojay
        11
    hellojay  
       2018-11-16 08:58:55 +08:00
    文档没有就去看源代码。
    tzhhahaha
        12
    tzhhahaha  
       2018-11-16 09:23:31 +08:00
    http://www.liujiangblog.com/course/django/
    给楼主提供一个链接。。。
    iiduce
        13
    iiduce  
       2018-11-16 09:25:15 +08:00
    你怼一下,我又看了一遍问题,结合下面你的回复,才理解你的意思。恕我愚钝,抱歉了。

    我现在理解是,你想在模板中生成一个 url,这个 url 附带当前页面的 get 动态参数。

    1、urls.py 文件中应该不能直接实现。

    2、#3 的方法可以。能用就好,优雅其次。

    3、我平时用的方法,在当前页面的 view 中 request.get 参数,放到模板变量{get_param}中,在模板里{% url "index" %}/?foo={get_param}。相比之下,优雅些?好处在于,方便在 view 中对 get 到的 param 做一些逻辑判断和处理。
    ltoddy
        14
    ltoddy  
    OP
       2018-11-16 10:12:50 +08:00
    @tzhhahaha 竟然学框架有看教程而不是文档的?......
    ltoddy
        15
    ltoddy  
    OP
       2018-11-16 10:13:56 +08:00
    @iiduce 我这个是 django 版本是 2.1.3(最新的), 我在考虑把 urls.py 中用 path 注册的视图函数换成 re_path 然后在 url 通过参数方式传递. (尝试).
    iiduce
        16
    iiduce  
       2018-11-16 10:16:53 +08:00
    @ltoddy 我对 django 的认知还停留在 1.* 版本
    xpresslink
        17
    xpresslink  
       2018-11-16 10:59:03 +08:00
    楼主这个问题简直无离头啊?
    在模板里直接这么写不就行了么?
    <a href=" {% url "index" %}?foo=bar">
    ltoddy
        18
    ltoddy  
    OP
       2018-11-16 11:01:29 +08:00 via Android
    @xpresslink 你不觉得很 ugly 吗。
    xpresslink
        19
    xpresslink  
       2018-11-16 11:01:29 +08:00
    补充一下,这样生成的 url 是 /path/index/?foo=bar 要多一个 /
    但是工作是正常的。
    ltoddy
        20
    ltoddy  
    OP
       2018-11-16 11:01:58 +08:00 via Android
    @xpresslink ok,我下午试试
    xpresslink
        21
    xpresslink  
       2018-11-16 11:04:53 +08:00
    @ltoddy 你这话无离头啊? url 参数就这得性。
    你要嫌 urgly 本身就不应当用这个方式。
    Django 本身有优雅的方式你不用啊
    lixuda
        22
    lixuda  
       2020-12-24 16:16:29 +08:00   ❤️ 1
    也遇到这个问题,flask url 是可以直接拼接 get 参数,django 找了 1 圈,没有发现,好像只能自己拼接。楼主不知道有没有找到比较优雅方式
    ltoddy
        23
    ltoddy  
    OP
       2020-12-27 21:43:47 +08:00
    @lixuda 找到更好的方式了。
    lixuda
        24
    lixuda  
       2020-12-28 09:03:06 +08:00
    @ltoddy 具体是怎么样实现的?谢谢
    lixuda
        25
    lixuda  
       2020-12-28 16:40:55 +08:00
    @ltoddy

    ```
    from django import template
    from urllib.parse import urlencode

    register = template.Library()

    @register.simple_tag
    def urlparams(*_, **kwargs):
    safe_args = {k: v for k, v in kwargs.items() if v is not None}
    if safe_args:
    return '?{}'.format(urlencode(safe_args))
    return ''

    index.html

    {% load urlparams %}

    <a href="{% url 'videos:index'}{% urlparams page='1' tag='sometag' %}">Next</a>

    ```

    是类似这样吗
    ltoddy
        26
    ltoddy  
    OP
       2020-12-28 19:54:32 +08:00
    @lixuda 是这样的,我的选择方式是脱坑 Python,目前主要搞 Go 和 Rust 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2264 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:09 · PVG 00:09 · LAX 08:09 · JFK 11:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.