У меня проблемы с использованием success_url с Django - PullRequest
1 голос
/ 26 апреля 2019

В просмотров У меня есть следующие классы:

class AddPersonView(CustomCreateView):
    template_name = "register/add.html"
    form_class = PersonForm
    model = Person
    obj = Person.objects.all().count()
    if obj > 0:
        obj = Person.objects.last()
        success_url = reverse_lazy('register:edit_person_view', kwargs={'pk': obj.id})

    def get_context_data(self, **kwargs):
        context = super(AddPersonView,
                        self).get_context_data(**kwargs)


class EditPersonView(CustomUpdateView):
    template_name = "register/edit.html"
    form_class = PersonForm
    model = Person
    obj = Person.objects.all().count()
    if obj > 0:
        obj = Person.objects.last()
        success_url = reverse_lazy('register:edit_person_view', kwargs={'pk': obj.id})

    def get_context_data(self, **kwargs):
        context = super(EditPersonView,
                        self).get_context_data(**kwargs)
        return context

Мое намерение состоит в том, чтобы, когда вы отправляете submit на странице регистрации человека, новая страница является страницей редактирования этого человека. Но то, как я его использую, после добавления или редактирования человека открывается следующая страница с id предыдущей записи. Например, если я сейчас зарегистрирую person с идентификатором 12 и дам submit страницу, которую я должен открыть, это будет mysite.com/register/edit/12, но она открывается mysite.com/register/edit/11.

Я попытался сделать следующее: вместо использования переменной sucess_url я использовал эту функцию в обоих классах:

def get_success_url(self):
    return reverse('register:edit_person_view', kwargs={'pk': self.kwargs('pk')})

Однако, давая submit странице, я получаю эту ошибку:

TypeError at /register/edit/12/
argument of type 'NoneType' is not iterable

During handling of the above exception (Reverse for 'None' not found. 'None' is not a valid view function or pattern name.)

Как правильно на следующей странице быть страницей редактирования объекта, который я добавляю / редактирую?

EDIT

Выполнение некоторых предполагаемых тестов на то, что функция get_success_url не работает, потому что, когда она использует ту же форму с переменной success_url, при редактировании лица и отправке, я перенаправляюсь на новую страницу для новой регистрации .

class EditPersonView(CustomUpdateView):
    template_name = "register/edit.html"
    form_class = PersonForm
    model = Person
    success_url = reverse_lazy('register:add_person_view')

    def get_context_data(self, **kwargs):
        context = super(EditPersonView,
                        self).get_context_data(**kwargs)
        return context

Но при использовании функции:

def get_success_url(self):
    return reverse('register:add_person_view')

Я получаю ту же ошибку

TypeError at /register/edit/12/
argument of type 'NoneType' is not iterable

During handling of the above exception (Reverse for 'None' not found. 'None' is not a valid view function or pattern name.)

Что плохого в том, что функция get_success_url не работает?

1 Ответ

0 голосов
/ 26 апреля 2019

Ваша ошибка в единицу времени вызвана тем, что Person.objects.last() вызывается при создании экземпляра представления создания, что составляет до создания нового персонажа.

Для get_success_url попробуйте это:

def get_success_url(self):
    return reverse('register:edit_person_view', kwargs={'pk': self.object.pk})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...