При получении поля 'None' ожидалось число, но получено 'update'. при использовании UpdateView в Django
Я использую UpdateView для страницы обновления, но получаю такую ошибку: Поле 'None' ожидало число, но получило 'update'.
мой urls.py выглядит следующим образом:
path('post/<pk>/update/', PostUpdateView.as_view(), name='post_update'),
Все работает нормально, если я меняю URL обновления на любой другой, кроме "post". Например, это работает нормально:
path('abcxyz/<pk>/update/', PostUpdateView.as_view(), name='post_update'),
Я хотел бы использовать слово "post" в URL, потому что я также использую его в других URL и они работают просто отлично (за исключением delete view, который дает мне ту же ошибку). Есть ли способ исправить эту ошибку без изменения URL?
Примечание: Это работало и раньше, но в какой-то момент сломалось, когда я пытался использовать django-PWA. Я не уверен, связано ли это с этим.
Спасибо за помощь!
Скорее всего, это связано с тем, что у вас есть другой путь, например:
path('post/update/update/', PostUpdateView.as_view(), name='post_update'),
или что-то подобное. Возможно, что один или оба update/
являются параметрами URL.
Если вы, например, посетите post/update/update
, и ваш PostUpdateView
будет определен первым, то это вызовет представление с pk='update'
.
Если первичный ключ - просто число, вы можете использовать конвертер путей <int:…>
для предотвращения срабатывания представления, когда pk
представляет собой нечто иное, чем последовательность цифр:
path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post_update'),
EDIT: Основываясь на вашем комментарии, перед этим был другой вид с:
path('post/<year>/<month>/', FilteredPostListView.as_view(), name='filtered_post')
Если таким образом посетить post/123/update
, то это вызовет FilteredPostListView
с 123
в качестве year
, а update
в качестве месяца, и, следовательно, вызовет ошибку.
Вы можете поместить путь ниже пути ProductUpdateListView
, и вы также можете использовать <int:…>
, чтобы вызвать представление только тогда, когда оба параметра являются последовательностями цифр:
path('post/<int:year>/<int:month>/', FilteredPostListView.as_view(), name='filtered_post')