我已经创建了一个Django应用程序,允许用户输入他们的股票交易,作为一个日志(log)工具.当用户单击索引页中的单个日记条目时,他们将被带到一个详细页面,显示该单个条目的所有信息(Single_Entry.html).此页面由UpdateView处理.在该页面中,用户可以编辑/更新任何信息,也可以删除该特定条目.为了实现这一点,我从django.views.Generic.dit导入了DeletionMixin模块.

然而,当我点击表单中的"Delete"按钮时,条目是复制的,而不是删除的!有人知道为什么会发生这种事吗??谢谢你的帮忙!

以下是我在views.py中的基于类的视图:

class SingleEntryView(UpdateView):
  template_name = "single_entry.html"
  model = Entry
  fields = ['ticker', 'strategy', 'result', 'comments', 'image']
  success_url = '/'
    
  def post(self, request, *args, **kwargs):
    if "delete_button" in self.request.POST:
      return self.delete(request, *args, **kwargs)
    
  def update_post(self, form, pk):
    if "update_button" in self.request.POST:
      form.instance.user = self.request.user
    return super(SingleEntryView, self).update_post(form)

single_entry.html:

{% extends 'base.html' %}

{% block title %}
    Trading Journal - Entry
{% endblock title %}Trading Journal

{% block content %}

<form method="POST" action="/">
    {% csrf_token %}
    {% for field in form %}
        {{field.label_tag}}
        {{field}}
        {% if field.errors %}
            <small class="error">{{ field.errors|striptags }}</small>            
        {% endif %}
    {% endfor %}
    <button type="submit" name="update_button">Save</button>
    <button type="submit" name="delete_button">Delete</button>
    
</form>

<img src="{{ entry.image.url }}" alt="{{ entry.result }}">

{% endblock content %}

Urls.py:

from django.urls import path
from django.contrib import admin
from . import views

urlpatterns = [
    path("", views.EntryView.as_view()),
    path("entries/<int:pk>/", views.SingleEntryView.as_view(), name="single-entry"),
    path("admin/", admin.site.urls)
]

向ChatGPT寻求帮助,它在我的UpdateView中推荐了以下代码(这给了我同样的问题):

  def post(request, self, form):
    print("post request")
    print("request.post", request.POST)
    if "delete" in request.POST:
      print("delete found")
      return self.delete_entry()
    else:
      print("else statement")
      #return super(SingleEntryView, self).post(request, form)

      return super().post(request, form)
      #return super().post(request, *args, **kwargs)      

  def delete_entry(self):
    entry = self.get_object()
    print("get object")
    entry.delete()
    messages.success(self.request, "Your entry was deleted successfully.")
    return redirect("/")

以下是我的models.py:


    from django.db import models
    from django.core.validators import MinValueValidator, MaxValueValidator
    from django.urls import reverse
    from django.utils.text import slugify


    class Entry(models.Model):
        ONEORB="1-Min ORB"
        FIVEORB="5-Min ORB"
        ABCD="ABCD"
        REVERSAL="Reversal"
        PROFIT="Profit"
        LOSS="Loss"
        RESULT_CHOICES = (
            (PROFIT, "Profit"),
            (LOSS, "Loss")
        )
        STRATEGY_CHOICES = (
            (ONEORB,"1-Min ORB"),
            (FIVEORB,"5-Min ORB"),
            (ABCD,"ABCD"),
            (REVERSAL,"Reversal")
        )

        entered_date=models.DateField(auto_now_add=True)
        ticker=models.CharField(max_length=8, default="")
        strategy=models.CharField(max_length=12, choices=STRATEGY_CHOICES, default="ONEORB")
        result=models.CharField(max_length=6, choices=RESULT_CHOICES, default="PROFIT")
        comments=models.TextField(max_length=300, blank=True)
        image = models.ImageField(upload_to="", null=True, blank=True) #will save to default BASE_DIR which is 'uploads'

        def __str__(self):
            return f"{self.result} {self.entered_date}"

推荐答案

在您的代码中,您似乎正在try 处理SingleEntryView类的post()方法中的条目的删除.但是Django提供的DeleteView已经处理了删除逻辑,所以您不需要覆盖删除的post()方法.现在修改代码,如下所示:

from django.urls import reverse_lazy
from django.contrib import messages
from django.views.generic import DeleteView

class SingleEntryDeleteView(DeleteView):
    model = Entry
    template_name = "delete_entry.html"
    success_url = reverse_lazy('index')

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, "Your entry was deleted successfully.")
        return super().delete(request, *args, **kwargs)

Now it will handle the deletion process, and entry will be deleted without duplication.

在您的single_entry.html中,您可以创建指向删除视图的链接或按钮,如下所示:

<form method="POST" action="{% url 'single-entry-delete' entry.pk %}">
    {% csrf_token %}
    <button type="submit">Delete</button>
</form>

确保您的urls.py中有对应于SingleEntryDeleteView的URL模式:

from django.urls import path
from .views import SingleEntryDeleteView

urlpatterns = [
    path('entries/<int:pk>/delete/', SingleEntryDeleteView.as_view(), name='single-entry-delete'),
]

现在,它应该运行得很好.编码快乐!

Python相关问答推荐

当多个值具有相同模式时返回空

如何使用html从excel中提取条件格式规则列表?

Vectorize多个头寸的止盈/止盈回溯测试pythonpandas

如何记录脚本输出

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

大小为M的第N位_计数(或人口计数)的公式

通过pandas向每个非空单元格添加子字符串

实现神经网络代码时的TypeError

Python中的变量每次增加超过1

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

使用特定值作为引用替换数据框行上的值

使用__json__的 pyramid 在客户端返回意外格式

在Django中重命名我的表后,旧表中的项目不会被移动或删除

如何重新组织我的Pandas DataFrame,使列名成为列值?

如何使用加速广播主进程张量?

浏览超过10k页获取数据,解析:欧洲搜索服务:从欧盟站点收集机会的微小刮刀&

为什么在Python中00是一个有效的整数?

无法在盐流道中获得柱子

根据过滤后的牛郎星图表中的数据计算新系列

如何在PYTHON中向单元测试S Side_Effect发送额外参数?