Обратный запрос 'edit-expense' без аргументов не найден. Проверен 1 шаблон(ы): ['edit\\\-expense/(?P<id>[0-9]+)$'] - Django

Пытаюсь отобразить страницу для обновления записи, но получаю следующую ошибку.

ОШИБКА

NoReverseMatch at /edit-expense/2
Reverse for 'edit-expense' with no arguments not found. 1 pattern(s) tried: ['edit\\-expense/(?P<id>[0-9]+)$']
Request Method: GET
Request URL:    http://127.0.0.1:8000/edit-expense/2
Django Version: 3.2.5
Exception Type: NoReverseMatch
Exception Value:    
Reverse for 'edit-expense' with no arguments not found. 1 pattern(s) tried: ['edit\\-expense/(?P<id>[0-9]+)$']
Exception Location: C:\Users\Ideation\AppData\Roaming\Python\Python39\site-packages\django\urls\resolvers.py, line 694, in _reverse_with_prefix
Python Executable:  C:\Program Files\Python39\python.exe
Python Version: 3.9.5
Python Path:    
['C:\\xampp\\htdocs\\Projects\\Ideation\\Ideation',
 'C:\\Users\\Ideation\\AppData\\Roaming\\Python\\Python39\\site-packages\\_pdbpp_path_hack',
 'C:\\Program Files\\Python39\\python39.zip',
 'C:\\Program Files\\Python39\\DLLs',
 'C:\\Program Files\\Python39\\lib',
 'C:\\Program Files\\Python39',
 'C:\\Users\\Ideation\\AppData\\Roaming\\Python\\Python39\\site-packages',
 'C:\\Users\\Ideation\\AppData\\Roaming\\Python\\Python39\\site-packages\\win32',
 'C:\\Users\\Ideation\\AppData\\Roaming\\Python\\Python39\\site-packages\\win32\\lib',
 'C:\\Users\\Ideation\\AppData\\Roaming\\Python\\Python39\\site-packages\\Pythonwin',
 'C:\\Program Files\\Python39\\lib\\site-packages']
Server time:    Fri, 27 Aug 2021 05:30:22 +0000

views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages

from .models import Category, Expense

@login_required(login_url = "login")
def expense_edit(request, id):
    expense = Expense.objects.get(pk=id)
    context = {
        'expense': expense,
        'values': expense,
    }
    if request.method == 'GET':
        return render(request, 'expenses/edit_expense.html', context)

    # if request.method == "POST":
    else:
        messages.add_message(request, messages.INFO, 'Handling post form')
        return render(request, 'expenses/edit_expense.html', context)

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name="index"),
    path('add-expense', views.add_expense, name="add-expense"),
    path('edit-expense/<int:id>', views.expense_edit, name="edit-expense"),
]

edit_expense.html

{% extends 'base.html' %}

{% block content %}

<div class="container mt-4">

    <h2>Edit Expense</h2>

    <nav aria-label="breadcrumb">
        <ol class="breadcrumb">
            <li class="breadcrumb-item"><a href="{% url 'index' %}">Expenses</a></li>
            <li class="breadcrumb-item active" aria-current="page">Edit Expense</li>
        </ol>
    </nav>



    <div class="card">
        <div class="card-body">
            <form action="{% url 'edit-expense' %}" method="POST">
                {% csrf_token %}
                {% include 'partials/_messages.html' %}
                <div class="form-group">
                    <label for="amountvalue">Amount</label>
                    <input value="{{values.amount}}" type="number" class="form-control-sm form-control" name="amount"
                        id="amountvalue">
                </div>
                <div class="form-group">
                    <label for="descriptionvalue">Description</label>
                    <input value="{{values.description}}" type="text" class="form-control-sm form-control"
                        name="description" id="descriptionvalue">
                </div>
                <div class="form-group">
                    <label for="categoryvalue">Category</label>
                    <select name="category" id="categoryvalue" class="form-control-sm form-control">
                        {% for category in categories %}
                        <option value="{{category.name}}">{{category.name}}</option>
                        {% endfor %}
                    </select>
                </div>
                <div class="form-group">
                    <label for="dateofexpensevalue">Date of Expense</label>
                    <input value="{{values.date}}" type="date" class="form-control-sm  form-control" name="expense_date"
                        id="dateofexpensevalue">
                </div>
                <input type="submit" value="Update" class="btn btn-primary mt-2">
            </form>
        </div>
    </div>





</div>

{% endblock content %}

index.html

{% extends 'base.html' %}

{% block content %}
<div class="container-fluid mt-4">

    <div class="row">
        <!-- <h2>Expenses List</h2> -->

        <div class="col-md-10">
            <nav aria-label="breadcrumb">
                <ol class="breadcrumb">
                    <li class="breadcrumb-item"><a href="#">Expenses</a></li>
                    <li class="breadcrumb-item active" aria-current="page">My Expenses</li>
                </ol>
            </nav>
        </div>


        <div class="col-md-2">
            <a href="{% url 'add-expense' %}" class="btn btn-primary">Add Expense</a>
        </div>

    </div>
    <br>
    {% include 'partials/_messages.html' %}
    {% if expenses.count %}
    <!-- <div class="container-fluid"></div> -->
    <table class="table table-stripped table-hover mt-4">
        <thead>
            <tr>
                <th>Amount ($)</th>
                <th>Category</th>
                <th>Description</th>
                <th>Date</th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            {% for expense in expenses %}
            <tr>
                <td>{{expense.amount}}</td>
                <td>{{expense.category}}</td>
                <td>{{expense.description}}</td>
                <td>{{expense.date}}</td>
                <td> <a href="{% url 'edit-expense' expense.id %}" class="btn btn-secondary btn-sm">Edit</a> </td>
            </tr>
            {% endfor %}
        </tbody>
    </table>
    <!-- </div> -->
    {% endif %}


</div>



{% endblock content %}

ОБЪЯСНЕНИЕ КОДА

- ПРОСМОТРОВ

  • Сначала необходимо войти в систему edit_expense.html.
  • Затем получение записи из базы данных с идентификатором.
  • Затем, создание контекста, в котором сначала будет запись о расходах и значения, содержащие запись о расходах, которые будут использоваться для отображения в HTML форме для обновления.
  • После этого, рендеринг шаблона.
  • Прямо сейчас значения не берутся из edit_expense.html, мы только отображаем их.

- URLS

  • Простое добавление url.

- РЕДАКТИРОВАТЬ РАСХОДЫ

  • Расширение базового шаблона, который содержит вещи, как обычно все, что содержит base.html.
  • Затем в теге шаблона block добавление хлебной крошки, после этого карточка, которая содержит HTML форму.
  • В HTML форме, только _messages.html только для отображения различных сообщений, которые является дополнительным и остальные вещи базовый HTML и некоторые bootstrap.

INDEX

  • Это отображение записей, которые показывают все нормально.

Ваша основная проблема заключается в этой строке в edit-expense.html

<form action="{% url 'edit-expense' %}" method="POST">

поскольку ваше представление требует передачи ID в URL.

вам нужно передать ID в действие формы, как в этой строке

{% url 'edit-expense' expense.id %}
Вернуться на верх