Ваша проблема в том, что вы пытаетесь получить URL для пути, который имеет переменное поле (в своем определении пути вы пытаетесь захватить идентификатор (path('studies/<int:id>/participants', [...])
), но когда вы запрашиваете обратный URL, используя имя пути не совпадает, потому что на самом деле не существует URL для этого пути, у которого нет идентификатора. Таким образом, вы говорите Django, что у всех участников списка должен быть идентификатор в URL, , но вы не указываете его при попытке получить ReverseMatch .
Вы можете указать шаблонизатору Django параметры для него, чтобы найти соответствие с этим синтаксисом:
{% url 'path_name' keyword_arg=keyword_val %}
Итак, ваша реализация будет:
{% url 'participantlist' id=the_id %}
Где the_id
(или любое другое имя по вашему выбору) - это переменная, которую вы должны установить в запросе рендеринга Django, передавая соответствующий ID. Я вижу, вы, возможно, уже передали эту переменную как study_id
, но я не совсем уверен, потому что я не знаю, какой идентификатор обозначает что. В любом случае, я думаю, что вы неправильно понимаете логику приложения. Похоже, вы отправляете действие по добавлению участника в URL-адрес, отвечающий за получение списка участников, когда это должно быть для add_participant
.
Редактировать
Я не рекомендую смешивать , добавляя и , редактируя в ваших представлениях. Добавление должно быть сделано для экземпляра, который еще не создан и не имеет собственного идентификатора (в вашем случае, у участника есть идентификатор, а также другая структура, содержащая участников, у которой есть другой список идентификаторов). Чтобы добавить участника, вы переходите к форме, в которой нет предварительно заданной информации об участнике, которого вы хотите добавить (если вы явно не решите это сделать), тогда как редактирование должно быть другой картой URL, которая запрашивает идентификатор существующего участника. для того, чтобы отредактировать его (а также учетные данные для входа, если вы решите).
Оба пути должны принимать get и post; это ты правильно понял Get отображает форму, но слушайте: действие формы должно совпадать с URL-адресом get; только когда вы публикуете данные, логика вашего представления воспримет их и примет соответствующие меры.
При необходимости вы можете разделить GET и POST URL, когда это относится к редактированию данных, но это обычно не рекомендуется, так как вы можете смешать это с действием получения данных, которые уже есть (и не получить форму для редактирования данные, которые отличаются).
Чтобы прояснить этот последний бит: ваш participantlist
1 путь предназначен для получения списка участников, а не для редактирования данных какого-либо участника. Если у вас есть путь для получения информации только от одного участника, это может быть
path('studies/<int:study_id>/participants/<int:participant_id>', views.get_participant, name='get_participant')
Хотя путь для редактирования этого участника (с использованием методов GET и POST) будет:
path('studies/<int:study_id>/participants/<int:participant_id>/edit', views.edit_participant, name='edit_participant')
Сноска
1 (стилистически лучше, если вы добавите подчеркивание к отдельным словам, таким как participant_list
)