在我的模型中,我想使用我在视图中使用的域名 (HOST)。由于“请求”对象,在可行的视图中。但是我该如何做这个模型方法呢?哪些不使用“HttpRequest”对象?
现在我在 settings.py 中设置一个全局值 HOST 并使用它,但这很难看。
另外,我真的不想管理“站点”(站点应用程序)——有没有办法,我可以获取“默认”站点主机名?
非常感谢你的帮助!(对不起我糟糕的英语)
在我的模型中,我想使用我在视图中使用的域名 (HOST)。由于“请求”对象,在可行的视图中。但是我该如何做这个模型方法呢?哪些不使用“HttpRequest”对象?
现在我在 settings.py 中设置一个全局值 HOST 并使用它,但这很难看。
另外,我真的不想管理“站点”(站点应用程序)——有没有办法,我可以获取“默认”站点主机名?
非常感谢你的帮助!(对不起我糟糕的英语)
如果您从视图中调用模型方法,您可以将请求的参数添加到模型方法中,并在您从视图中调用它时包含它。例如
class MyModel(models.Model):
...
def MyMethod(self, request):
# Do whatever with request here
def MyView(request):
mm = MyModel()
mm.MyMethod(request)
如果request
对象不可用,我认为最好的方法是使用Django Sites 框架。这需要事先正确设置site.domain
(并且site.name
,如果需要)。 .get_current
是根据你设置的django.conf.settings.SITE_ID
。
>>> from django.contrib.sites.models import Site
>>> obj = MyModel.objects.get(id=3)
>>> obj.get_absolute_url()
'/mymodel/objects/3/'
>>> Site.objects.get_current().domain
'example.com'
>>> 'http://%s%s' % (Site.objects.get_current().domain, obj.get_absolute_url())
'http://example.com/mymodel/objects/3/'
您还可以使用 HttpRequest 的“request.get_host()”方法获取站点的域名,这将使用来自 HTTP_X_FORWARDED_HOST 和 HTTP_HOST 标头的信息返回请求的原始主机,如果不提供值,该方法将使用SERVER_NAME 和 SERVER_PORT 的组合。