url django中的多个参数

时间:2015-07-13 14:12:26

标签: django django-urls

也许这个问题会重复,但我找不到任何我需要的解决方案。我需要将两个不同的参数传递给DetailView中的一个网址(我不使用函数视图,大部分是我找到的带有函数视图的可能解决方案)。我已经完成了一些观点,但它没有意义,因为它不起作用。我怎样才能做到这一点?例如:

url(r'^crear-puntointeraccion/(?P<pk>[-_\w]+)/(?P<point_id>[-_\w]+)/$'

如果它没有找到pk或者point_id显示404,我已经做了一些事情,但是只接受一个参数,另一个参数没有接受它,因为如果我写了一些不存在的ID,无论如何都显示结果。< / p>

2 个答案:

答案 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_fieldslug_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对象中可用。