【问题标题】:Django - button to remove row in sqlite3Django - 在 sqlite3 中删除行的按钮
【发布时间】:2022-03-09 01:18:41
【问题描述】:

我有一个问题.. 我有一个带有邮箱的 Django 应用程序,该邮箱显示了一个包含所有邮件及其重要性(优先回答)的列表。单击“管理”按钮可以查看邮件消息。

现在我还想添加一个“删除”按钮,它将删除列表中的这封电子邮件,也就是 sqlite3 数据库中的行。

我尝试了多种方法,因为我在多个论坛上都看到了这个。我的问题是我对 Django 很陌生,我不知道我可以将哪些答案与我的代码中已有的答案结合起来。

这就是我现在所拥有的(它不起作用,因为我仍在努力寻找可行的解决方案)

ma​​ilindex.html:

<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
    <div class="form-group">
        <a href="{% url 'core:mail' mail.id %}" class="btn btn-secondary btn-sm">Manage</a>
        <button type="submit" name="deletemail" value="deletemail" class="btn btn-secondary btn-sm">Delete</button>
    </div>
</form>

views.py

class MailboxView(generic.ListView):
    extra_context = {"mailbox_page": "active"}
    model = MailMessage
    context_object_name = 'mails'
    template_name = 'core/mailbox/mailindex.html'

    def post(self, request):
        # if 'deletemail' in self.request.POST:
        if request.POST.get('deletemail'):
            mail = MailMessage.objects.get(pk=13)
            mail.delete()
            return HttpResponseRedirect(self.request.path_info)

编辑: 我更进一步:现在该按钮可以删除 ID 为 13 的电子邮件...如何将 mail.id 发送到views.py 中的函数?

【问题讨论】:

    标签: python django sqlite django-forms


    【解决方案1】:

    Django 不会触发delete_mail_listing 或除ListView 的代码流中的方法之外的任何其他方法。

    可能最优雅的方式是使用DeleteView

    from django.contrib.auth.mixins import LoginRequiredMixin
    from django.urls import reverse_lazy
    from django.views.generic import DeleteView
    
    class MailMessageDeleteView(LoginRequired, DeleteView):
        model = MailMessage
        success_url = reverse_lazy('mailbox')

    urls.py中,你可以注册这个视图:

    urlpatterns = [
        path('', login_required(views.IndexView.as_view()), name='index'),
        path('mailbox', login_required(views.MailboxView.as_view()), name='mailbox'),
        path('mailbox/delete/<int:pk>/', views.MailMessageDeleteView.as_view(), name='delete')
    ]

    然后在模板中提交给MailMessageDeleteView:

    <form  method="POST" action="{% url 'delete' pk=mail.pk %}">
        {% csrf_token %}
        <button type="submit" class="btn btn-secondary btn-sm">Delete</button>
    </form>

    注意:您可以将视图限制为基于类的视图,以向经过身份验证的用户提供 LoginRequiredMixin mixin [Django-doc].

    【讨论】:

    • 这看起来很不错。我试图编辑我的代码,但与“从 django.contrib.auth.mixins 导入 LoginRequiredMixin” 斗争,因为它找不到包,我也不确定我是否需要它,因为我为用户使用另一个登录名谁进入仪表板?我现在收到一条错误消息:“找不到‘删除’的反向。‘删除’不是有效的视图函数或模式名称。”对于该行:action="{% url 'delete' pk=mail.pk %}"
    • 请确保您提供的url路径与path()中的name属性值相同
    • 另外,尽量保持函数名相同
    • @user2133561:视图需要有path(..., name='delete')
    • @WillemVanOnsem 嗨,是的,我肯定看到它找不到我的“删除”功能...我已经创建了路径(...,名称='删除'),但仍然如此找不到我的删除功能,我显然没有把它放在正确的位置,但在脚本中尝试了多个位置......我应该把这个功能放在哪里?
    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 2016-09-05
    • 2021-08-18
    • 1970-01-01
    • 2011-01-18
    • 2020-08-31
    • 2016-03-02
    • 1970-01-01
    相关资源
    最近更新 更多