大图片:我想在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请求之后的详细视图,那么我就知道如何解决这个问题(我认为)。任何想法或想法将不胜感激!
答案 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
之类的查询字符串,则会中断。