【问题标题】:How to get the url before render it如何在渲染之前获取 url
【发布时间】:2020-08-16 21:02:08
【问题描述】:

我想建立一个系统,需要检测用户打开了哪些网址并计算打开的次数。

有几个不同的 url 共享同一个 WaitView(TemplateView),所以我想在用户单击它时计算每个 url 的数字。

我在 urls 中添加了一个 dic,希望它可以将用户打开的正确 url 返回到 Waitview 中的 context1。

但我找不到正确的方法来获取正确的 url,(我尝试使用 HttpRequest.get_full_path() 但它继续出错。 "TypeError: get_full_path() 缺少 1 个必需的位置参数:'self'")

此外,我希望 WaitView 可以接收到正确的 url 并计算次数,然后在打开的页面上显示次数。(在呈现之前需要正确的 url)

如果你对此有一些建议,我会徘徊。

非常感谢您的帮助。

# urls.py
'''
urlpatterns = [
    re_path('get_times/.+', WaitView.as_view(), {"url": ***CORRECT_URL***})
]

'''



# views.py
'''
class WaitView(TemplateView):
    template_name = 'wait.html'

    def get_context_data(self, **kwargs):
        context1 = kwargs.items()
        print(context1)
'''

【问题讨论】:

    标签: python html django url view


    【解决方案1】:

    请求对象存储在View.request 属性中。因此,您可以在视图方法中使用self.request 访问它,因此您可以通过以下方式获取 url:

    class WaitView(TemplateView):
        template_name = 'wait.html'
    
        def get_context_data(self, **kwargs):
            print(self.request.get_full_path())
            return super().get_context_data(**kwargs)

    您可以使用.build_absolute_uri() method [Django-doc] 生成绝对URI(包括协议、主机名等)。

    所以不需要在上下文中添加参数。

    【讨论】:

    • 如果可能的话,如果您能回答一些问题,将不胜感激。
    • 我很困惑 super() 的功能在这里意味着什么。以及为什么当我们定义 'def get_context_data(self, **kwargs):' 时,通常会跟在 'context = super().get_context_data(**kwargs) '
    • 对不起,我不知道如何输入评论。
    • super() 返回一个代理对象,它将沿着 MRO 向上,直到找到定义 get_context_data 的基类,并因此调用具有 super 的基类。然后我们返回该结果。但是我打错了,因为在这里我们最好也传递**kwargs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多