url django 中的多参数
Multi parameters in url django
也许这个问题被重复了,但我找不到我需要的任何解决方案。我需要将两个不同的参数传递给 DetailView
中的一个 url (我没有使用函数视图,我发现的大多数可能的解决方案都是函数视图)。我已经完成了一些观点,但是把它放在这里没有意义,因为它们不起作用。我怎样才能做到这一点?例如:
url(r'^crear-puntointeraccion/(?P<pk>[-_\w]+)/(?P<point_id>[-_\w]+)/$'
如果它没有找到 pk 或 point_id 显示 404,我已经做了一些事情但只接受一个参数,另一个参数它不接受它因为如果我写一些不存在的 ID无论如何显示结果。
Django 详细信息视图预计只会找到一个 url 参数。这是由 DetailView 的 pk_url_kwarg
(默认为 pk)或 slug_field
和 slug_url_kwarg
(默认为 slug)定义的。
为了访问任何额外的 url 参数,您需要覆盖默认的 DetailView 方法。哪一个取决于额外 url 参数的影响。如果额外的参数影响了需要检索的对象,则覆盖 DetailView class 的 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
对象中可用。
您可以通过覆盖 DetailView
的 get_object()
函数来执行此检查。
get_object()
returns 视图正在显示的对象。在您看来,DetailView
将使用 pk
参数执行对象查找。在通过 pk
进行此对象检索过程之前,我们将添加一个检查以验证 url.
中 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
验证的逻辑,或者在 get_object()
函数本身中编写您自己的逻辑。
也许这个问题被重复了,但我找不到我需要的任何解决方案。我需要将两个不同的参数传递给 DetailView
中的一个 url (我没有使用函数视图,我发现的大多数可能的解决方案都是函数视图)。我已经完成了一些观点,但是把它放在这里没有意义,因为它们不起作用。我怎样才能做到这一点?例如:
url(r'^crear-puntointeraccion/(?P<pk>[-_\w]+)/(?P<point_id>[-_\w]+)/$'
如果它没有找到 pk 或 point_id 显示 404,我已经做了一些事情但只接受一个参数,另一个参数它不接受它因为如果我写一些不存在的 ID无论如何显示结果。
Django 详细信息视图预计只会找到一个 url 参数。这是由 DetailView 的 pk_url_kwarg
(默认为 pk)或 slug_field
和 slug_url_kwarg
(默认为 slug)定义的。
为了访问任何额外的 url 参数,您需要覆盖默认的 DetailView 方法。哪一个取决于额外 url 参数的影响。如果额外的参数影响了需要检索的对象,则覆盖 DetailView class 的 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
对象中可用。
您可以通过覆盖 DetailView
的 get_object()
函数来执行此检查。
get_object()
returns 视图正在显示的对象。在您看来,DetailView
将使用 pk
参数执行对象查找。在通过 pk
进行此对象检索过程之前,我们将添加一个检查以验证 url.
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
验证的逻辑,或者在 get_object()
函数本身中编写您自己的逻辑。