【问题标题】:Django - Creating a link that maps to multiple different pages?Django - 创建一个映射到多个不同页面的链接?
【发布时间】:2018-11-03 14:55:32
【问题描述】:

我是编码新手,我正在尝试使用 Django(如果可能)创建一个链接,该链接将用户发送到三个不同的 url,并且被重定向到每个 URL 的概率相同。因此,只有一个按钮可供选择,但它可以有三种不同的结果。

我希望链接只是一个引导导航栏按钮。到目前为止,我有以下代码适用于我创建的单个基本 html (surprise.html) url:

相关代码在:

观看次数:

def surprise(request):
    return render(request, 'sitepages/surprise.html') 

模板:

<a class="nav-item nav-link" href="{% url 'surprise' %}">Surprise</a>

urls.py:

url(r'^surprise/', sitepages.views.surprise, name="surprise"),

所以这将重定向到一个基本的内部 html 页面。但我想知道是否可以在模板代码中添加另一个 href?

也许需要一个新模型?我正在考虑在列表中使用带有三个不同 url 的 random.choice,但似乎它们需要是 str 类型,这超出了我的范围。

任何建议或提示将不胜感激。 谢谢!

【问题讨论】:

  • 是你项目中将用户发送到三个不同的url的三个url,这三个url在哪里?
  • @Lemayzeur 目前我已经创建了 3 个不同的 url,它们位于 sitepages/templates/sitepages 作为简单的 html 文件。 Sitepages 是应用程序的名称。理论上,我通过views.py 和urls.py 将它们连接起来,但为了完成这项任务,它们可以是任何url。它们可以是 3 个外部链接,例如 1.href=google.com 2.href=yahoo.com 3.href=blanck.com

标签: python django python-3.x


【解决方案1】:

我建议在模板渲染之前使用自定义模板标签或随机化视图中的 url,并通过上下文将其传递给模板。这是使用模板标签的解决方案:

app_name/templatetags/util_tags.py(记得添加__init__.py文件)

import random 
from django import template
from django.urls import reverse

register = template.Library()

@register.simple_tag
def random_url():
    list_of_route_names = ['view1', 'view2', 'view3'] # names from urls.py
    return reverse(random.choice(list_of_route_names))

模板.html:

{% load util_tags %}
<a class="nav-item nav-link" href="{% random_url %}">Surprise</a>

urls.py:

urlpatterns = [
url(r'^view1/', sitepages.views.view1, name="view1"),
url(r'^view2/', sitepages.views.view2, name="view2"),
url(r'^view3/', sitepages.views.view3, name="view3"),
]

【讨论】:

  • 感谢您的帮助。我觉得我很接近,但我得到一个 'random_url' did not receive value(s) for the argument(s): 'format_string' 错误消息。我在 templatetags 文件夹中创建了 init_.py 文件,并按照建议通过 urls.py 和 views.py 设置和连接了 3 个基本 view.html 页面。
  • 我让它工作了。我从def random_url(format_string): 中删除了format_string 输入,然后将sitepages.views 导入到util_tags.py 中。这将所有东西连接在一起,按钮按需要工作。被发送到三个页面之一的随机机会相同。再次感谢功能码!
  • 是的,对不起,那是我的错。更新原始答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 2015-06-02
  • 2019-09-10
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多