使用网址查询参数动态get_absolute_url

时间:2018-02-21 17:06:26

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

大图片:我想在get_absolute_url(见下文)中使用我的反向方法返回一个在末尾附加了查询参数的网址,例如<url>?foo=bar。此外,我希望由触发对get_absolute_url的调用的POST请求指定bar,作为表单的输入(但不是模型表示的字段,临时的)或作为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中的urlpatter看起来像:

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请求之后的详细视图,那么我就知道如何解决这个问题(我认为)。任何想法或想法将不胜感激!

1 个答案:

答案 0 :(得分:0)

正如您所说,您无法在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之类的查询字符串,则会中断。