Django : использование @property в success_url KO. в то время как использование его с get_success_url нормально (представление на основе класса).

Я нашел обходной путь для моей проблемы, но мне нужно знать, почему первый вышеупомянутый случай не работает.

Мне нужно передать параметр (reman_pk) моему представлению, но когда я пытаюсь :

class RepairCreateView(LoginRequiredMixin, CreateView):

    @property
    def reman_pk(self):
        return int(self.kwargs['reman_pk'])
    [...]
    success_url = reverse_lazy(
        'reman:update-reman', kwargs={'pk': reman_pk})
    [...]

... Я получил ошибку

django.urls.exceptions.NoReverseMatch: Реверс для 'update-reman' с ключевыми аргументами '{'pk': <property object at 0x10c20bbd0>}' не найден. 1 шаблон(ы) проверены: ['reman/update/(?P[0-9]+)/$']

Но когда в том же представлении, основанном на классе, я использую :

def get_success_url(self, **kwargs):
        if kwargs != None:
            return reverse_lazy('reman:update-reman', kwargs={'pk': self.reman_pk})

... все в порядке: int хорошо передается в моем URL.

Я пытался передать int(reman_pk) в первом методе ... не лучше.

Я уже использовал @property в прошлом и всегда получал значение (int/str), а не объект свойства.

Это не относится к django, это относится к python в целом. Когда вы хотите получить доступ к свойству класса внутри класса, вы всегда должны вызывать self перед этим!

class Tree:
    fruits = 5

    @property
    def leafes(self):
        return self.fruits * 5

    def show_tree(self):
        print(self.fruits)
        print(self.leafes)
        print(leafes)  # THIS LINE WOULD ERROR
Вернуться на верх