【问题标题】:Dynamic get_absolute_url using url query parameters使用url查询参数动态get_absolute_url
【发布时间】:2018-08-01 08:53:39
【问题描述】:

大图:我希望我在 get_absolute_url(见下文)中的反向方法返回一个在末尾附加查询参数的 url,例如<url>?foo=bar。此外,我希望 bar 由触发 get_absolute_url 调用的 POST 请求指定,可以作为表单的输入(但不是模型表示的字段,是临时的)或 url 查询参数。我可以使用任何一种方法在我的视图中轻松访问bar,但我似乎无法弄清楚如何在我的模型中访问它。

这里的动机是我的详细信息页面使用 javascript 将模型中的字段拆分为不同的选项卡(想想https://www.w3schools.com/howto/howto_js_tabs.asp)。当用户更新模型时,他们选择他们想要更新的选项卡,然后更新模板只呈现模型中与该选项卡相关的字段。更重要的是,用户提交更新后,我希望详情页知道打开用户刚刚编辑的特定标签。

(如果字段是模型的一部分,我了解它是如何工作的;在get_absolute_url with parameters 中,解决方案非常简单,涉及使用self.id。但在我的情况下,bar 不是模型,我不知道如何访问它)

一些细节:我的项目中有一个名为 Context 的模型。我使用名为 ContextForm 的模型表单和名为 ContextUpdate 的通用 UpdateView 为模型实现了通用 DetailView 和更新页面。提交表单后,我在 models.py 中使用 get_absolute_url 重定向到详细信息页面:

def get_absolute_url(self):
        return reverse("context:review",kwargs={"slug": self.slug})

我在 urls.py 中的 urlpatterns 看起来像:

urlpatterns = [
    url(r'^(?P<slug>[-\w]+)$',views.ContextDetail.as_view(),name="review"),
    url(r'^(?P<slug>[\w]+)/edit$',views.ContextUpdate.as_view(),name="edit"),
]

我可以很容易地在我的 UpdateView 中访问这个参数:

def post(self,request,**kwargs):
        print (request.POST.get("bar")) #accessing input to form
        print (request.GET.get("bar")) #accesssing url parameter
        return super().post(request,**kwargs)

但是当在模型内部调用get_absolute_url 时,我似乎无法再访问它了。

关于如何完成此任务的任何建议?我想使用 get_absolute_url (连同模型表单、通用视图等),以便我可以遵循 Django 约定,但似乎使用 get_absolute_url 使我想要实现的功能变得困难。如果在 POST 请求之后重定向到详细视图发生在我的视图中,那么我会知道如何解决这个问题(我认为)。任何想法或想法将不胜感激!

【问题讨论】:

    标签: django django-views url-parameters modelform django-generic-views


    【解决方案1】:

    正如您所说,您无法在 get_absolute_url 方法中访问请求。因此,您应该覆盖get_success_url,您可以从中访问它。

    def get_success_url(self):
        return reverse(reverse("context:review", kwargs={"slug": self.object.slug}) + '?bar=%s' % self.request.GET.get('bar')
    

    或者如果你想重复使用get_absolute_url:

    def get_success_url(self):
        return self.object.get_absolute_url + '?bar=%s' % self.request.GET.get('bar')
    

    第二个选项是 DRYer,但如果将 get_absolute_url 更改为包含类似 ?foo=foo 的查询字符串,则会中断。

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 2017-07-22
      • 2021-12-05
      • 1970-01-01
      • 2014-06-30
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多