Django 模板 url 如何构造请求参数 - V2EX
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 日 5687 次点击
    这是一个创建于 2613 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如在 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 日
    这个是最基本的,看一下官方文档。
    chengxiao
        2
    chengxiao  
       2018 年 11 月 16 日
    {% url "index" %}/?foo=bar ,不过记得官方并不推荐这种写法 ,"/path/index/foo/bar/",一般是这样写
    hzwjz
        3
    hzwjz  
       2018 年 11 月 16 日 via Android
    不用生成的,想获取 foo 的值,可以这样子 request.Get.get('foo')。
    ltoddy
        4
    ltoddy  
    OP
       2018 年 11 月 16 日
    @iiduce 文档里要是有,我还问这个问题干嘛.
    ltoddy
        5
    ltoddy  
    OP
       2018 年 11 月 16 日
    @hzwjz 你看清楚我问的呀, 我问的是 django 模板那边怎么构造请求参数, 不是视图函数那边怎么取到请求参数.
    ltoddy
        6
    ltoddy  
    OP
       2018 年 11 月 16 日
    @chengxiao 对,我现在就是用这个方案解决的, 这个方案太 ugly 了.
    rockdodos
        7
    rockdodos  
       2018 年 11 月 16 日
    url.py:path("/index/<str:foo>", view.index, name="index")
    templates:{% url "index" bar %}
    wonderay
        8
    wonderay  
       2018 年 11 月 16 日
    {% 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 日 via Android
    @wonderay 我试过了,不行的,模板那边报错的。
    ltoddy
        10
    ltoddy  
    OP
       2018 年 11 月 16 日 via Android
    @wonderay 我要的是 url 的请求参数,又不是动态路由的参数。
    hellojay
        11
    hellojay  
       2018 年 11 月 16 日
    文档没有就去看源代码。
    tzhhahaha
        12
    tzhhahaha  
       2018 年 11 月 16 日
    http://www.liujiangblog.com/course/django/
    给楼主提供一个链接。。。
    iiduce
        13
    iiduce  
       2018 年 11 月 16 日
    你怼一下,我又看了一遍问题,结合下面你的回复,才理解你的意思。恕我愚钝,抱歉了。

    我现在理解是,你想在模板中生成一个 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 日
    @tzhhahaha 竟然学框架有看教程而不是文档的?......
    ltoddy
        15
    ltoddy  
    OP
       2018 年 11 月 16 日
    @iiduce 我这个是 django 版本是 2.1.3(最新的), 我在考虑把 urls.py 中用 path 注册的视图函数换成 re_path 然后在 url 通过参数方式传递. (尝试).
    iiduce
        16
    iiduce  
       2018 年 11 月 16 日
    @ltoddy 我对 django 的认知还停留在 1.* 版本
    xpresslink
        17
    xpresslink  
       2018 年 11 月 16 日
    楼主这个问题简直无离头啊?
    在模板里直接这么写不就行了么?
    <a href=" {% url "index" %}?foo=bar">
    ltoddy
        18
    ltoddy  
    OP
       2018 年 11 月 16 日 via Android
    @xpresslink 你不觉得很 ugly 吗。
    xpresslink
        19
    xpresslink  
       2018 年 11 月 16 日
    补充一下,这样生成的 url 是 /path/index/?foo=bar 要多一个 /
    但是工作是正常的。
    ltoddy
        20
    ltoddy  
    OP
       2018 年 11 月 16 日 via Android
    @xpresslink ok,我下午试试
    xpresslink
        21
    xpresslink  
       2018 年 11 月 16 日
    @ltoddy 你这话无离头啊? url 参数就这得性。
    你要嫌 urgly 本身就不应当用这个方式。
    Django 本身有优雅的方式你不用啊
    lixuda
        22
    lixuda  
       2020 年 12 月 24 日   1
    也遇到这个问题,flask url 是可以直接拼接 get 参数,django 找了 1 圈,没有发现,好像只能自己拼接。楼主不知道有没有找到比较优雅方式
    ltoddy
        23
    ltoddy  
    OP
       2020 年 12 月 27 日
    @lixuda 找到更好的方式了。
    lixuda
        24
    lixuda  
       2020 年 12 月 28 日
    @ltoddy 具体是怎么样实现的?谢谢
    lixuda
        25
    lixuda  
       2020 年 12 月 28 日
    @ltoddy

    ```
    frm 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 日
    @lixuda 是这样的,我的选择方式是脱坑 Python,目前主要搞 Go 和 Rust 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2663 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 03:19 PVG 11:19 LAX 19:19 JFK 22:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86