【问题标题】:Why is my delete button not deleting my database object? Django为什么我的删除按钮没有删除我的数据库对象?姜戈
【发布时间】:2019-10-13 22:17:30
【问题描述】:

我拼凑了一个删除按钮并编辑了我的视图,但它不起作用。有人可以帮我解决吗?

我已经移动了一些代码并尝试了一些东西,但我无法让它工作。我需要有人告诉我我做错了什么。

我的看法:

def post_edit(request, pk):
    post = get_object_or_404(Listing, pk=pk)
    if request.method == "POST":
        form = ListingForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.save()
            return redirect('post_view', pk=post.pk)
    else:
        form = ListingForm(instance=post)
    if request.POST.get('delete'):
        post.delete()
        return redirect('listings')
    return render(request, 'post_edit.html', {'form': form})

我的html:

{% extends 'base.html' %}

{% block title %}Post Edit{% endblock %}

{% block content %}
    Hi {{ user.username }}!
    <p><a href="{% url 'logout' %}">logout</a></p>

    <h1>Edit listing:</h1>
    <p>The listing will only be viewable to users if "Is Live" is checked.</p>
    <form method="POST" enctype="multipart/form-data" class="post-form">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
        <p>Click the button below to delete this listing. No second warning is given, once you click delete it will be
            removed.</p>
        <button type="delete" class="delete btn btn-default">delete</button>
    </form>

{% endblock %}

【问题讨论】:

    标签: python django python-3.x django-models django-views


    【解决方案1】:

    "delete" 不是 HTML 表单控件的有效类型。您需要将其更改为 "submit"(因为您仍想提交表单)。

    您要做的是创建两个具有相同名称和不同值的按钮,如下所示:

    <button type="submit" name="submit" value="submit" class="save btn btn-default">Save</button>
    <p>Click the button below to delete this listing. No second warning is given, once you click delete it will be
                removed.</p>
    <button type="submit" name="submit" value="delete" class="delete btn btn-default">delete</button>
    

    然后您可以检查您的视图是否单击了删除按钮,如下所示:

    def post_edit(request, pk):
        post = get_object_or_404(Listing, pk=pk)
        if request.method == "POST":
            if request.POST.get('submit') == 'delete':
                 post.delete()
                 return redirect('listings')
            form = ListingForm(request.POST, instance=post)
            if form.is_valid():
                post = form.save(commit=False)
                post.save()
                return redirect('post_view', pk=post.pk)
        else:
            form = ListingForm(instance=post)
        return render(request, 'post_edit.html', {'form': form})
    

    请注意,我将删除按钮的检查移到 if request.method == "POST": 块内,原因有两个:

    1. 如果它实际上是一个 post 方法,您只需要检查 POST 值。

    2. 编辑帖子然后删除它是没有用的。

    【讨论】:

    • 没有头绪,从教程中复制过来的。
    • 经过进一步检查,我认为这是为了当用户发出 GET 请求时,只呈现 EditForm。无论如何,我发布的代码应该可以满足您的需求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多