【问题标题】:Django access site name/url in template - views, contexts and settings模板中的 Django 访问站点名称/url - 视图、上下文和设置
【发布时间】:2022-01-09 04:32:53
【问题描述】:

(感觉像是“最佳实践”类型的问题,如果这些不属于这里,请见谅)

我正在构建一个具有用户注册和密码重置功能的网站,这两个功能都会向用户发送电子邮件,其中包含一个链接以单击以完成相应的过程。在暂存箱上进行测试时,我使用了一种肮脏的解决方法来完成概念证明——在模板中硬编码网站地址)不用说,我想尽快解决这个问题。环顾四周,找到了对 django.contrib.sites 的引用,这看起来像是一个可能的解决方案,尽管有一件事情让我很困扰 - 从技术上讲,只有一个站点,但有两个阶段,登台和生产。我不想与当前可能滥用的“网站”对抗,因为这些网站可能适用另一种解决方案。

然后我考虑了另一种方法 - 将相应的 URL 添加到相应的 settings.py 文件中,我已经掌握了其中一个 - 一个用于本地,一个用于暂存,一个用于生产。这里的问题可能很明显 - 我认为从模板中读取 settings.py 是不合适的(或可能的),并试图使解决方案尽可能简单,我使用了一些标准视图,这意味着我无权访问其代码,以向上下文添加值。也许我应该覆盖这些标准视图?只需调用“超级”,然后将我的自定义数据添加到上下文中?但我不知道这是否是正确的方法。

第三个选项似乎是添加一个自定义上下文处理器来实现相同的目标,即使设置值可用于感兴趣的模板。很抱歉关于“设计”多样性的长问题。

【问题讨论】:

  • 您是否尝试过从请求对象中获取站点 url? stackoverflow.com/questions/2345708/…
  • 如果您需要在@kmmbvnr 提到的请求中不可用的上下文中添加数据,那么通常的做法是为基于类的视图覆盖get_context_data(..)。如果您有许多具有相同需求的基于类的视图,请将您的 get_context_data 放在 Mixin 中。 Stackoverflow 上有很多例子
  • 感谢你们俩;原来模板中已经有 {{ domain }} 的东西,它不起作用的原因是 nginx 配置中缺少一行
  • 问题仍然存在 - 现有的上下文处理器中的哪个创建了该“域”?这些都来自我用来构建网站核心的教程,现在我希望我知道 LOL

标签: django django-templates django-settings django-context django-sites


【解决方案1】:

好吧,毕竟这是一条错误的路径——我的模板中的 {{ domain }} 不起作用(解析为“localhost”)的原因是 nginx 配置中缺少一行:

  location / {
    proxy_pass http://unix:/run/gunicorn.sock;
    proxy_set_header Host $http_host;
  }

(确切地说是 proxy_set_header 行)

不能说我 100% 了解这里发生的事情,但至少现在我可以继续前进;最大的问题是这个 {{ domain }} 指令来自哪里 - 无法分辨从教程中复制的几个上下文处理器中的哪一个:

"django.template.context_processors.debug",
"django.template.context_processors.request",
"django.contrib.auth.context_processors.auth",
"django.contrib.messages.context_processors.messages",

【讨论】:

    猜你喜欢
    • 2018-04-13
    • 1970-01-01
    • 2017-01-31
    • 2014-07-16
    • 2017-01-29
    • 2014-07-03
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多