我已经创建了一个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}"