也许这个问题会重复,但我找不到任何我需要的解决方案。我需要将两个不同的参数传递给DetailView
中的一个网址(我不使用函数视图,大部分是我找到的带有函数视图的可能解决方案)。我已经完成了一些观点,但它没有意义,因为它不起作用。我怎样才能做到这一点?例如:
url(r'^crear-puntointeraccion/(?P<pk>[-_\w]+)/(?P<point_id>[-_\w]+)/$'
如果它没有找到pk或者point_id显示404,我已经做了一些事情,但是只接受一个参数,另一个参数没有接受它,因为如果我写了一些不存在的ID,无论如何都显示结果。< / p>
答案 0 :(得分:1)
您可以通过覆盖get_object()
的{{1}}功能来执行此检查。
DetailView
返回视图正在显示的对象。在您的视图中,get_object()
将使用DetailView
参数执行对象查找。在通过pk
进行此对象检索过程之前,我们将添加一个检查以验证网址中pk
参数的值。
如果point_id
有效,我们会调用point_id
方法,其中super()
将进行正常的对象检索和验证。如果pk
无效,我们会引发point_id
例外。
Http404
注意:在上面的代码中,我假设from django.http import Http404
class MyView(DetailView):
def get_object(self, queryset=None):
point_id = self.kwargs.get('point_id')
# write your logic to validate point_id here
if not check_valid_point_id(point_id): # assumed 'check_valid_point_id' function validates point_id
raise Http404("Invalid point id") # raise 404 exception on invalid point_id
return super(MyView, self).get_object(queryset) # call super() on valid point_id
函数将check_valid_point_id()
作为参数验证point_id
。您可以在该函数中添加point_id
验证的逻辑,或者在point_id
函数本身中编写自己的逻辑。
答案 1 :(得分:0)
Django详细视图期望只找到一个url参数。这由DetailView的pk_url_kwarg
(默认为pk)或slug_field
和slug_url_kwarg
(默认为slug)定义。
要访问任何额外的url参数,您需要覆盖默认的DetailView方法。哪一个,取决于受额外url参数影响的内容。如果额外参数影响需要检索的对象,则覆盖DetailView类的get_queryset
方法。在那里,您可以通过self.kwargs
对象访问参数。
如果只需要将url参数作为要加载的附加数据(可能是请求的主要对象),则覆盖get_context_data
方法,可以通过以下方式覆盖后者:
def get_context_data(self, **kwargs):
context = super(YourClassView, self).get_context_data(**kwargs)
# context now holds the context of your view, you can add extra data to
# it with the following way:
context['mydata'] = "Some data"
# return the context
return context
在上面的示例中,您的pk将在self.kwargs
对象中可用。