Как получить атрибут '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 calling reverse(…) [Django] and then wrap it in a HttpResponseRedirect object [Django-doc]. The redirect(…) 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, вы подсказали мне решение

Вот как это выглядело до и после: enter image description here

enter image description here

Вернуться на верх