使用 Django 提交表单后不显示表值

问题描述 投票:0回答:1

我创建了一个简单的应用程序来跟踪股票交易。我为每个交易“条目”都有一个称为盈亏的值,它根据头寸大小、开盘价和收盘价计算利润或损失。这个功能都是在Entry模型中完成的。

我已经验证代码确实正确执行并将正确的值保存到数据库中的“Pnl”字段。但由于某种原因,如果您单击浏览器上的“后退”箭头,您只能看到添加到表 (entries.html) 中的新条目。即使手动刷新页面也没有任何作用。

事实上,除非我单击“返回”,否则不会显示任何条目。

entries.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
{% endblock title %}Trading Journal

{% block content %}
    <form method="POST" enctype="multipart/form-data" action="/">
        {% csrf_token %}
        {{ form }}
        <button>Submit</button>
    </form>


{% endblock content %}

{% block table %}

<table class="blueTable sortable"> 
    <thead>
    <tr>
    <th>Date</th>
    <th>Ticker</th>
    <th>Strategy</th>
    <th>Result</th>
    <th>Open Price</th>
    <th>Position</th>
    <th>Closed Price</th>
    <th>P&L</th>
    <th>Comments</th>
    </tr>
    </thead>
    <tfoot>
    <tr>
    <td colspan="9">
    <div class="links"><a href="#">&laquo;</a> <a class="active" href="#">1</a> <a href="#">2</a> <a href="#">3</a> <a href="#">4</a> <a href="#">&raquo;</a></div>
    </td>
    </tr>
    </tfoot>
    <tbody>
        {% for entry in entries %}
        <tr>
            <td><a href="{% url 'single-entry' entry.id %}">{{entry.entered_date}}</a></td><td>{{entry.ticker}}</td><td>{{entry.strategy}}</td><td>{{entry.result}}</td><td>{{entry.open_price}}</td><td>{{entry.position}}</td><td>{{entry.close_price}}</td><td class="entry_pnl">{{entry.pnl}}</td><td>{{entry.comments}}</td></tr>
        {% endfor %}
    
    </tbody>
    </tr>
    </table>
    {% if request.user.is_authenticated %}
    <a href="{% url 'logout' %}"><button>Logout</button></a>
{% endif %}
{% endblock table %}

Views.py:(这显示了包含所有条目的表格以及输入新条目的表单)

class EntryView(LoginRequiredMixin, View):
  login_url = 'login'
  def get(self, request):
    logged_in_user = request.user.id
    print("****************")
    print(f'Logged in user:{logged_in_user}')
    entries = Entry.objects.filter(trader_id=logged_in_user).order_by("entered_date") #see: https://docs.djangoproject.com/en/5.0/topics/db/queries/#field-lookups
    form = EntryForm()
    return render(request, "entries.html", {"form":form, "entries":entries, "user":logged_in_user})
  
  def post(self, request):
    form = EntryForm(request.POST, request.FILES) #must add request.FILES for uploads
    if form.is_valid():
      form.instance.trader = request.user #youre assigning one object to another; cant assign one object to a number. Or you could do trader_id on the LH side
      form.instance.calculate_pnl()
      form.save()
      print('***************')
      print(f"Entry pnl:{form.instance.pnl}")
      return render(request, "entries.html")
    else:
      messages.error(request, "Please correct the errors below.")
      return render(request, "entries.html", {"form":form})

模型.py:

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator
from django.urls import reverse
from django.contrib.auth.models import User


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'
    position = models.PositiveIntegerField(default=1, validators=[MinValueValidator(1)], blank=True, null=True)
    open_price = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True)
    close_price = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True)
    pnl = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True)
    trader = models.ForeignKey(User, on_delete=models.CASCADE, blank=False, related_name="entries")
    
    def calculate_pnl(self):
        self.pnl = round(self.position * self.close_price - self.position * self.open_price, 2) 

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

我尝试注释掉指向我的以下 main.js 文件的脚本标记,该文件根据值是正还是负对值进行颜色编码。没有任何效果。

main.js:

document.addEventListener('DOMContentLoaded', function() {
    let displayObj = document.querySelectorAll('.entry_pnl');
    
    displayObj.forEach(function(el) {
        // Parse the inner text of the '.entry_pnl' element to get the numerical value
        let pnlValue = parseFloat(el.innerText);
        
        if(pnlValue < 0) {
            el.style.color = 'red';
        } else {
            el.style.color = 'green';
        }
    });
});
javascript django
1个回答
0
投票

您正在渲染“entries.html”模板,但没有为条目提供必要的上下文。

当您提交表单时,post 方法会保存新条目,但在再次呈现模板时不会在上下文中包含更新的条目列表。

将 post 函数更新为这个:

def post(self, request):
    form = EntryForm(request.POST, request.FILES)
    if form.is_valid():
        form.instance.trader = request.user
        form.instance.calculate_pnl()
        form.save()
        messages.success(request, "Entry added successfully.")
    else:
        messages.error(request, "Please correct the errors below.")
    
    # Retrieve the updated list of entries
    logged_in_user = request.user.id
    entries = Entry.objects.filter(trader_id=logged_in_user).order_by("entered_date")
    
    return render(request, "entries.html", {"form": form, "entries": entries, "user": logged_in_user})
© www.soinside.com 2019 - 2024. All rights reserved.