Удаление объекта из вида в Джанго - PullRequest
0 голосов
/ 13 мая 2018

У меня есть страница, которая показывает список объектов, и я хочу добавить кнопку рядом с каждым, чтобы позволить пользователю удалить его.Я нашел несколько вопросов о подобных сценариях онлайн, но по какой-то причине у меня продолжают появляться ошибки, когда я пытаюсь воспроизвести решения.

Вот функция удаления в views.py:

def delete_dish(request, pk):
    query = Dish.objects.get_object_or_404(pk)
    supermenu = query['supermenu'].pk
    query.delete()
    return redirect('foodmenu:menu', supermenu)

Вот форма в шаблоне HTML:

            {% if not supermenu.dish_set.count == 0 %}
            <ul>
            {% for dish in supermenu.dish_set.all %}


                <li>
                {{ dish.name }} - {{ dish.description }}
                <form action="{%  url 'foodmenu:delete_dish' dish.id %}" method="POST">
                    {% csrf_token %}
                    <button type="submit">X</button>
                </form>

                </li>


                    {% if not dish.price_set.count == 0 %}
                    <ul>
                    {% for price in dish.price_set.all %}
                        {% if price.label %}
                            <li>{{ price.label }}: {{ price.cost }}</li>
                        {% else %}
                            <li>{{ price.cost }}</li>
                        {% endif %}
                    {% endfor %}
                    </ul>
                    {% endif %}


                {% endfor %}
            </ul>

            {% else %}
            <p>No dishes on this menu!</p>

        {% endif %}

А вот и urls.py:

app_name = 'foodmenu'
urlpatterns = [
    ...
    path('dish/delete/<int:dish.id>', views.delete_dish, name="delete_dish")
]

Когда я нажимаю кнопку, браузер переходит на ./dish/delete/1 (1 - это pk объекта), но Django возвращает ошибку 404.

1 Ответ

0 голосов
/ 13 мая 2018

Вместо query = Dish.objects.get_object_or_404(pk) вы должны использовать get_object_or_404 ярлык:

from django.shortcuts import get_object_or_404

from django.views.decorators.http import require_POST

@require_POST
def delete_dish(request, pk):
    if request.method
    query = get_object_or_404(Dish, pk=pk)
    supermenu = query.supermenu.pk
    query.delete()
    return redirect('foodmenu:menu', supermenu)

Также измените ваш шаблон URL на:

path('dish/delete/<int:pk>/', views.delete_dish, name="delete_dish")

UPD

Как упомянул @daniherrera в своем комментарии, вы, вероятно, захотите проверить метод запроса, чтобы предотвратить случайное удаление.Для этого вы можете использовать require_POST декоратор.

...