Джанго, CBVs и pk_url_kwarg отсутствуют - PullRequest
1 голос
/ 28 июня 2019

Я учу Джанго. У меня последняя версия 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. Это очень странно, потому что я использую это в других представлениях.

Чего мне не хватает?

1 Ответ

1 голос
/ 28 июня 2019

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)

Это потому, что вы указали <uuid:profile_id> в своем URL-пути.

Второй способ - переписать вашу конфигурацию URL так, чтобы она была 'Student/createFromProfile/<uuid:pk>'. Таким образом, pk_url_kwarg должен работать со значением по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...