Django中的URL和模板混淆

-4 投票
1 回答
531 浏览
提问于 2025-04-16 07:45

我的网址是:

1. http://localhost:8000/docs/[slug]
2. http://localhost:8000/docs/[slug]/login

我有一个网址1,想在它之前调用网址2。我想把一个叫做slug的值传递给与网址2对应的函数。在模板中,我应该怎么写表单的动作事件呢?

1 个回答

2

我同意,这段话几乎让人看不懂,但我会尽量给出一个简单的解释。

关于调用顺序,其实没有固定的顺序。用户可能先访问网址 2 或者网址 1。你无法保证他们会先访问哪个,因为他们可能直接把网址输入到浏览器里。你能做的就是在 request.session 的字典里设置一个变量,然后在你的 login 网址中进行检测。

如果你想把 slug 传递到另一个网址,假设你有一个包含这个内容的网址:

urls = ('',
url(r'docs/(?P<slug>\w+)', 'app.views.slug', name='slug-view'),
url(r'docs/(?P<slug>\w+)/login', 'app.views.slug_login', name='slug-login'),
#..
)

那么在你的模板中,你可以这样做:

<form action="{% url slug-login slugname %}" method="POST">

你的 views.py 文件大概会是这样的。

def slug(request, slug):
    #
    #

    return render_to_response('templatename.html', {'slugname':slug}, context_instance=RequestContext(request))

def slug_login(request, slug):
    # do something with slug.

这样,当你访问 slug 视图时,你会把一个叫做 slugname 的变量传递给模板,模板会利用 Django 的网址库来解析 urls.py 中一个特定名称的网址,并将这个名称参数 slug 的值设置为 slugname。

我建议你试试看。

我还建议你去了解一下 Django 的网址调度器。你使用正则表达式而没有命名参数是可以的,但其实不是最佳实践。我还建议你看看 Django 的快捷方式(render_to_response),这是一种快速将变量传递到模板的方法,还有 Django 模板语言 本身。

撰写回答