У меня есть страница index.html со списком «карточек», где на каждой карточке есть ссылка «Нажмите, чтобы выбрать».
Когда пользователь нажимает на эту ссылку, я хотел бы вызвать функцию в Python, чтобы выбрать этот элемент, см.:
def selectItem(request, item):
#so something with this item
Итак, на моей html-странице:
<div class = "card-action">
<a href = "{{ selectItem(myitem) }}">Selecionar</a>
</div>
Это не работает. Как правильно это делать?






Вы не можете вызвать такую функцию. Браузер запрашивает данные с помощью HTTP-запроса, а сервер отвечает (HTTP) ответом. У таких запросов есть URL-адрес, и Django может направить запрос - с URL-адресом - в правое представление, которое будет вычислять ответ.
Таким образом, нам нужно создать представление, которое затем можно будет вызвать. Ваш звонок уже совсем близко:
# app/views.py
from django.http import HttpResponse
def select_item(request, item_id):
# so something with this item_id
# ...
return HttpResponse()Поскольку большинство объектов не сериализуемы (и обычно вы этого не хотите, поскольку это может предоставить пользователю много (потенциально конфиденциальных) данных), нам, таким образом, необходимо работать с id (идентификатором, который, например, хранится в база данных, которая соответствует к объекту).
Ответ содержит данные в ответе. Часто это HTML-код, который затем обрабатывается браузером.
Теперь в urls.py мы можем указать, как выглядит URL, например:
# app/urls.py
from django.urls import path
from app.views import select_item
urlpatterns = [
path('select_item/<int:item_id>/', select_item, name='select_item_view'),
# ...
]urlpatterns необходимо включить в корень urlpatterns (в корень проекта).
Теперь в шаблоне HTML мы можем сгенерировать URL-адрес, соответствующий этому представлению, примерно так:
<div class = "card-action">
<a href = "{% url 'select_item_view' item_id=myitem.id %}">Selecionar</a>
</div>Затем Django убедится, что href указывает на URL-адрес, который ссылается на представление select_item с правильным параметром.
Очень полезный ответ, спасибо. Если вы можете помочь, у меня есть еще одно сомнение. Должен ли я создать view_select.py или поместить все в тот же файл view.py? Я думаю, что view.py очень подробный
Обычно все представления помещаются в views.py, но вы действительно можете записывать разные файлы. Однако создание каждого представления в отдельном файле было бы более "Java-ish" подходом.
Еще раз спасибо Виллем
Вам необходимо передать URL-адрес представлению, поэтому
{% url 'view_name' item_id=myitem.id %}, учитывая, что это представление, и вы правильно обрабатываете URL-адрес. Кроме того, вы не можете просто передать объект, так как этот объект не может быть «доставлен». Вы можете, например, использоватьidи выполнить соответствующую обработку в представлении (чтобы снова превратитьidв объект).