我正在学习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
方法try
和id=self.kwargs["profile_id"]
部分中发出通知。我试图使用id=self.kwargs[self.pk_url_kwarg]
,但得到了一个django调试页面,该页面不知道pk_url_kwarg
是什么。我可以在PyCharm调试器中停止并检查self
,实际上,它没有pk_url_kwarg
的条目。这是一个特别的奇怪之处,因为我正在其他视图中使用它。
我想念什么?
答案 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
应该可以使用默认值。