Как получить атрибут 'value' тега <input> в Django?
У меня есть такая функция просмотра для удаления задачи из приложения ToDo:
def delete_task(request):
if request.method == 'POST':
task = Task.objects.get(pk=request.POST['delete'])
task.delete()
return HttpResponseRedirect(reverse('todoapp:index'))
else:
tasks = Task.objects.all()
return render(request, 'index.html', {'tasks': tasks})
Я получаю 'значение' тега
Вот мой html:
<form action="{% url 'todoapp:delete_task' %}" method="post">
{% csrf_token %}
<input type="submit" name="delete" value="{{ task.id }}" class="btn btn-primary">
</form>
И моя кнопка показывает id задачи вместо слова 'Delete' Есть идеи, как я могу получить данные из тега другим способом? Спасибо заранее!!!
Ну а value="…"
[mdn-doc] в <input type="button">
используется для отображения текста в кнопке.
Эквивалентным способом сделать это было бы использование <button>
, где у вас есть больше свободы в определении содержимого кнопки, например:
<form action="{% url 'todoapp:delete_task' %}" method="post">
{% csrf_token %}
<button type="submit" name="delete" value="{{ task.id }}" class="btn btn-primary">Delete</button>
</form>
При этом обычно первичный ключ кодируется в URL, это гарантирует, что Django направит запрос к вашему представлению только в том случае, если такой первичный ключ присутствует.
Ваш вид также может быть улучшен до:
from django.shortcut import redirect
def delete_task(request):
if request.method == 'POST':
task = Task.objects.filter(pk=request.POST['delete']).delete()
return redirect('todoapp:index')
else:
tasks = Task.objects.all()
return render(request, 'index.html', {'tasks': tasks})
Note: You can make use of
redirect(…)
[Django-doc] instead of first callingreverse(…)
[Django] and then wrap it in aHttpResponseRedirect
object [Django-doc]. Theredirect(…)
function does not only offer a more convenient signature to do this, it also for example will use the.get_absolute_url()
method [Django-doc] if you pass it a model object.
Решением было просто передать дополнительную переменную в функцию view:
def delete_task(request, task_id):
If request.method == 'POST':
Task.objects.get(pk=task_id).delete()
return redirect('todoapp:index')
else:
tasks = Task.objects.all()
return render(request, 'index.html', {'tasks': tasks})
А мой html в итоге value='Delete' !!!
<form action="{% url 'todoapp:delete_task' task.id %}" method="post">
{% csrf_token %}
<input type="submit" name="delete" value="Delete" class="btn btn-primary">
</form>
Огромное спасибо @willeM_VanOnsem, вы подсказали мне решение