【问题标题】:Django url pattern multiple Parameters (without pk)Django url 模式多个参数(不带pk)
【发布时间】:2018-03-01 06:52:16
【问题描述】:

我是 Django 框架的新手,有一件事困扰着我。

我想要一个简单的休息电话:

www.abc.com/users/1/cantonments/1/

如果我在 url 模式中使用“pk”,一切都可以开箱即用(pk、pk1、pk2....)。 但是我有一些权限功能,它期望用户和营地的 kwargs 中的参数以“upk”和“cpk”的形式出现。因此,如果我将 pk 更改为 upk 一切都会中断。不知何故,网址需要 ONE pk。

这行得通:

url(r'^users/(?P<pk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),

这不是:

url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),

有没有什么办法可以让 url 模式不需要一个 pk 条目?

附:错误:

Expected view CantonmentDetail to be called with a URL keyword argument named "pk". Fix your URL conf, or set the `.lookup_field` attribute on the view correctly.

编辑:

我的观点很简单:

# Authenticated User can show Cantonment Detail
class CantonmentDetail(generics.RetrieveAPIView):
    serializer_class = serializers.CantonmentSerializer
    permission_classes = [permissions.IsAuthenticated]

    def get_queryset(self):
        return Cantonment.objects.filter(pk=self.kwargs['cpk'])

编辑2:

我将 get_queryset 更改为获取对象,它可以工作。

def get_object(self):
    queryset = self.filter_queryset(self.get_queryset())
    obj = queryset.get(pk=self.kwargs['cpk'])
    return obj

编辑3: 使用

lookup_url_kwarg = "cpk"

在课堂上也可以。

【问题讨论】:

  • 发表你的看法?
  • 你的 view.py 可能有问题 get 参数可以添加这个
  • 已经here讨论清楚了

标签: django parameters django-rest-framework url-pattern


【解决方案1】:

您是否使用变量的新名称改变了看法? 如果你有这样的网址:

url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
views.CantonmentDetail.as_view()),

你应该像这样更新你的视图:

def view_name(request, upk=None, cpk=None):
    ...

【讨论】:

    【解决方案2】:

    upk 对查找没有任何影响(因为主键通过设计标识单个对象)。

    所以对于视图,lookup_field 需要设置为 'cpk' 并且一切正常。

    【讨论】:

      【解决方案3】:

      您可能认为您正在访问 pk 变量

      urls.py

      url(r'^users/(?P<upk>[0-9]+)/cantonments/(?P<cpk>[0-9]+)/$',
      views.CantonmentDetail.as_view()),
      

      views.py

      class your_class_name(ListView):
          def view_name(self):
              upk=self.kwargs['upk']
              cpk=self.kwargs['cpk']
              print upk, cpk
              ...
      

      希望对你有帮助

      【讨论】:

      • 这看起来很有希望。如何将 upk=None 等添加到基于通用类的视图中?感谢您的帮助。
      【解决方案4】:

      您可以使用 get 方法和您的 url 发送可选的 pk,例如

      www.abc.com/users/1/cantonments/?&upk=1
      

      并且网址应该是

      url(r'^users/(?P<pk>[0-9]+)/cantonments/$',
      views.CantonmentDetail.as_view()),
      

      和views.py

      def view_name(request, pk=None):
          upk = request.GET.get('upk')
      

      【讨论】:

        猜你喜欢
        • 2018-12-30
        • 2020-08-14
        • 2017-05-04
        • 2013-10-27
        • 2011-12-14
        • 2021-01-29
        • 2018-04-20
        • 2017-11-14
        • 1970-01-01
        相关资源
        最近更新 更多