Django View: ошибка DoesNotExist при попытке редактирования продукта

Я пытаюсь создать функцию редактирования продукта в своем приложении Django, но при попытке доступа к странице редактирования продукта сталкиваюсь с ошибкой DoesNotExist.

Вот моя функция просмотра:

@login_required
def edit_product(request, pid):
    product = Product.objects.get(pid=pid)
    if request.method == "POST":
        form = AddProductForm(request.POST, request.FILES, instance=product)
        if form.is_valid():
            new_product = form.save(commit=False)
            new_product.user = request.user  # assuming there is a user field in the Product model
            new_product.save()
            form.save_m2m()  # Save many-to-many relationships
            return redirect("vendorpannel:dashboard")
        else:
            # Print form errors for debugging
            print(form.errors)
    else:
        form = AddProductForm(instance=product)

    context = {
        "form": form,
        "product": product,
    }
    return render(request, "vendorpannel/edit-product.html", context)

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

DoesNotExist at /vendorpannel/edit_product/11
Product matching query does not exist.

Я проверил свою базу данных, товар с указанным pid существует. Я не уверен, что вызывает эту ошибку.

Может ли кто-нибудь помочь мне определить проблему и предложить решение?

если тебе нужен мой template:

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>Edit Product</title>
    <!-- Bootstrap CSS -->
    <link href = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel = "stylesheet">
    <style>
        body {
            padding-top: 50px;
        }
        .container {
            max-width: 600px;
            margin: auto;
        }
        .form-group label {
            font-weight: bold;
        }
        .form-actions {
            text-align: right;
        }
        .form-actions button {
            margin-left: 10px;
        }
    </style>
</head>
<body>

<div class = "container">
    <h2 class = "mb-4">Edit Product</h2>
    <form method = "POST" enctype = "multipart/form-data" action = "{% url 'vendorpannel:edit_product' product.id %}">
        {% csrf_token %}
        <div class = "form-group">
            <label for = "id_title">Title</label>
            <input type = "text" class = "form-control" id = "id_title" name = "title" value = "{{ product.title }}" required>
        </div>
        <div class = "form-group">
            <label for = "id_description">Description</label>
            <textarea class = "form-control" id = "id_description" name = "description" rows = "4" required>{{ product.description }}</textarea>
        </div>
        <div class = "form-group">
            <label for = "id_price">Price ($)</label>
            <input type = "number" class = "form-control" id = "id_price" name = "price" value = "{{ product.price }}" step = "0.01" required>
        </div>
        <div class = "form-group">
            <label for = "id_status">Status</label>
            <input type = "text" class = "form-control" id = "id_status" name = "status" value = "{{ product.status }}" required>
        </div>
        <div class = "form-group">
            <label for = "id_date">Date</label>
            <input type = "date" class = "form-control" id = "id_date" name = "date" value = "{{ product.date }}" required>
        </div>
        <div class = "form-group">
            <label for = "id_image">Product Image</label>
            <input type = "file" class = "form-control-file" id = "id_image" name = "image">
            {% if product.image %}
                <img src = "{{ product.image.url }}" alt = "{{ product.title }}" class = "img-thumbnail mt-2" style = "max-width: 200px;">
            {% endif %}
        </div>
        <div class = "form-actions">
            <a href = "{% url 'vendorpannel:vendor_shop' %}" class = "btn btn-secondary">Cancel</a>
            <button type = "submit" class = "btn btn-primary">Save Changes</button>
        </div>
    </form>
</div>

<!-- Bootstrap JS and dependencies -->
<script src = "https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src = "https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
<script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>

</body>
</html>

Редактировать:

URL.py:

from django.urls import path
from vendorpannel import views

app_name = 'vendorpannel'

urlpatterns = [
    path('vendor_pannel1/', views.vendor_pannel1, name='vendor_pannel1'),
    path('vendor_signup/', views.vendor_signup, name='vendor_signup'),
    path('login_view/', views.login_view, name='login_view'),
    path('vendor_shop/', views.vendor_shop, name='vendor_shop'),
    path('vendor_tickets/', views.vendor_tickets, name='vendor_tickets'),
    path('vendor_user/', views.vendor_user, name='vendor_user'),
    path('vendor_settings/', views.vendor_settings, name='vendor_settings'),
    path('add_product/', views.add_product, name='add_product'),
    path('edit_product/<pid>', views.edit_product, name='edit_product'),
]

Дополнительная информация:

1.Я использую Джанго 3.2. 2. В моей модели Product есть поле первичного ключа с именем id. 2.Я пробовал использовать get_object_or_404 вместо Product.objects.get(), но все равно получаю ту же ошибку.

Заранее спасибо за вашу помощь!

Можете поделиться urls.py?

willeM_ Van Onsem 05.07.2024 11:52

Я отредактировал эти данные, пожалуйста, проверьте это...

Harry Khan 05.07.2024 11:58

у тебя есть поле pid и id? ваш шаблон отправляет id, но ваш просмотр проверяет pid

folen gateis 05.07.2024 13:36

@folengateis я понял, спасибо... теперь все работает

Harry Khan 05.07.2024 14:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Перейти на страницу администратора
  2. Проверьте URL-адрес «11», действительно ли он существует или нет. Возможно, у вас проблемы с URL-адресами. Другое мнение: вам нужно в этой строке: ath('edit_product/',views.edit_product, name='edit_product'), использовать / после pid
Ответ принят как подходящий

Вы использовали pid в своих представлениях, но пытались получить к нему доступ в своих шаблонах с помощью product.id. Один из способов исправить это — изменить pid в product = Product.objects.get(pid=pid) на id. Также предлагаю вам использовать get_object_or_404:

product = get_object_or_404(Product, id=pid)

Затем в вашем urls.py:

path('edit_product/<int:pid>', views.edit_product, name='edit_product'),

Это должно устранить вашу ошибку DoesNotExist.

Другие вопросы по теме