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

您可以通过覆盖 DetailViewget_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() 函数本身中编写您自己的逻辑。