我已经创建了一个Django应用程序,允许用户输入他们的股票交易,作为一个journaling工具.当用户单击索引页中的单个日记条目时,他们将被带到一个详细页面,显示该单个条目的所有信息(Single_Entry.html).此页面由UpdateView处理.在该页面中,用户可以编辑/更新任何信息,也可以删除该特定条目.表单上有两个按钮,一个用于"删除",另一个用于"更新".

删除工作正常.更新过go 是有效的,但现在由于某种原因不起作用了!条目中不会更新任何内容.我也搞不懂为什么‘消息’中间件没有输出到屏幕上.与我的所有print()语句一样,控制台上没有输出任何内容.

以下是我的观点.py:

from django.forms.models import BaseModelForm
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpResponseRedirect
from django.views import View
from django.contrib import messages
from django.urls import reverse_lazy
from .forms import EntryForm
from .models import Entry
from django.views.generic.edit import UpdateView, DeletionMixin
from django.views.generic import DeleteView


# Create your views here. 

class EntryView(View):
  def get(self, request):
    entries = Entry.objects.all().order_by("entered_date")
    form = EntryForm()
    return render(request, "entries.html", {"form":form, "entries":entries})
  
  def post(self, request):
    form = EntryForm(request.POST, request.FILES) #must add request.FILES for uploads
    print(request.FILES)
    if form.is_valid():
      form.save()
      messages.success(request, "Entry created!")
      return redirect("/")
    else:
      messages.error(request, "Please correct the errors below.")
      return render(request, "entries.html", {"form":form})

class SingleEntryView(UpdateView):
  template_name = "single_entry.html"
  model = Entry
  fields = ['ticker', 'strategy', 'result', 'comments', 'image']
  success_url = '/'
  form = EntryForm

  def post(self, request, *args, **kwargs):
        if 'delete_button' in self.request.POST:
            self.object = self.get_object()
            self.object.delete()
            messages.success(request, "Entry has been deleted")
            return HttpResponseRedirect(self.get_success_url())
        elif 'update_button' in self.request.POST:  
            return super().post(request, *args, **kwargs)
        return redirect('/')

  def form_valid(self, form):
    form.instance.user = self.request.user
    return super().form_valid(form)

下面是urls.py:

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

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

以下是Single_Entry.html:

{% extends 'base.html' %}



{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

{% 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 tyupe="submit" name="delete_button">Delete</button>

</form>    

<!-- {% if entry.image.url != Null %} -->
    <img src="{{ entry.image.url }}" alt="{{ entry.result }}">
        <!-- {% else %} -->
    <img src="", alt="{{ entry.result }}">
<!-- {% endif %} -->

{% endblock content %}

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}"

Forms.py:

from django import forms
from .models import Entry

class EntryForm(forms.ModelForm):
    class Meta:
        model=Entry
        fields='__all__'

我期待UpdateView使用新信息更新条目信息.

推荐答案

您使用的是UpdateView,而实际执行的是self.object.delete().这太不可思议了,不是吗?

更新应在UpdateView中处理,删除应在DeleteView中处理.然后使用HTML5 <button formaction />.

views.py

from django.views.generic.edit import UpdateView, DeleteView
from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse_lazy


# •••Rest of your views•••


class SingleEntryView(UpdateView, SuccessMessageMixin):
    template_name = "single_entry.html"
    form = EntryForm
    fields = ['ticker', 'strategy', 'result', 'comments', 'image']
    model = Entry
    success_url = reverse_lazy("index")
    success_message = "Entry has been updated"


class DeleteEntry(DeleteView, SuccessMessageMixin):
    model = Entry
    success_url = reverse_lazy("index")
    success_message = "Entry has been deleted"

urls.py

urlpatterns = [
    # •••Rest of your paths•••
    path("entry/delete/<int:pk>/", views.DeleteEntry.as_view(), name="delete-entry")
    # •••Rest of your paths•••
]

single_entry.html

<form method="POST" action="{% url 'single-entry' entry.pk %}">
    <!--•••Rest of your form•••-->
    <button type="submit" formaction="{% url 'delete-entry' entry.pk %}">Delete</button>
</form>

Python相关问答推荐

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

对某些列的总数进行民意调查,但不单独列出每列

Django mysql图标不适用于小 case

scikit-learn导入无法导入名称METRIC_MAPPING64'

如何从.cgi网站刮一张表到rame?

当递归函数的返回值未绑定到变量时,非局部变量不更新:

Python—为什么我的代码返回一个TypeError

提高算法效率的策略?

递归函数修饰器

为什么t sns.barplot图例不显示所有值?'

python的文件. truncate()意外地没有截断'

如何设置nan值为numpy数组多条件

如何获取包含`try`外部堆栈的`__traceback__`属性的异常

如何防止html代码出现在quarto gfm报告中的pandas表之上

如何写一个polars birame到DuckDB

随机森林n_估计器的计算

极点用特定值替换前n行

极点:在固定点扩展窗口

使用Scikit的ValueError-了解