缺少Django,CBV和pk_url_kwarg

时间:2019-06-28 00:54:52

标签: django

我正在学习django。我有最新的django和Python 3.7.x。

我对self.pk_url_kwarg,如何创建以及何时创建有疑问。我在https://docs.djangoproject.com/en/2.2/ref/class-based-views/mixins-single-object/处看到了该文档,但是找不到我希望得到的答案。

具体来说,我在url.py文件中有一个条目,例如:

...
path(
    'Student/createFromProfile/<uuid:profile_id>',
    student.CreateFromProfile.as_view(),
    name="student_create_from_profile"
),
...

我为此有一个CBV:

@method_decorator(verified_email_required, name='dispatch')
class CreateFromProfile(CreateView):

    model = Profile
    success_url = '/Members'

    def get(self, request, *args, **kwargs):

        try:
            account_holder = Profile.objects.get(
                id=self.kwargs["profile_id"]
            )
        except ObjectDoesNotExist:
            messages.error(
                request,
                "Unknown Profile ID."
            )
            return HttpResponseRedirect(self.success_url)

通过get方法tryid=self.kwargs["profile_id"]部分中发出通知。我试图使用id=self.kwargs[self.pk_url_kwarg],但得到了一个django调试页面,该页面不知道pk_url_kwarg是什么。我可以在PyCharm调试器中停止并检查self,实际上,它没有pk_url_kwarg的条目。这是一个特别的奇怪之处,因为我正在其他视图中使用它。

我想念什么?

1 个答案:

答案 0 :(得分:1)

pk_url_kwarg是URLConf关键字参数的名称,默认情况下为pk。在您的特定情况下,应将其设置为profile_id

@method_decorator(verified_email_required, name='dispatch')
class CreateFromProfile(CreateView):

    model = Profile
    success_url = '/Members'

    # Here we're setting correct pk_url_kwarg
    pk_url_kwarg = 'profile_id'

    def get(self, request, *args, **kwargs):

        try:
            account_holder = Profile.objects.get(
                id=self.kwargs[self.pk_url_kwarg]
            )
        except ObjectDoesNotExist:
            messages.error(
                request,
                "Unknown Profile ID."
            )
            return HttpResponseRedirect(self.success_url)

那是因为您在URL路径中指定了<uuid:profile_id>

第二种方法是将您的url配置重写为'Student/createFromProfile/<uuid:pk>'。这样pk_url_kwarg应该可以使用默认值。