试图通过父函数调用设置相关模型字段

2024-05-01 21:50:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个光盘库编辑例程。应用程序允许您输入CD艺术家姓名、CD标题和CD的总时间。然后,用户可以输入曲目信息。输入曲目信息时,我希望应用程序显示当前运行时间,包括此曲目,以及基于CD长度的剩余时间。模型和功能如下所示


class Cd(models.Model):
  artist_name    = models.CharField(max_length=155)
  cd_title       = models.CharField(max_length=155)
  cd_total_time           = models.TimeField(default="00:00:00")
  cd_total_time_delta     = models.DurationField(default=timedelta)
  cd_run_time         = models.TimeField(default="00:00:00",blank=True)
  cd_run_time_delta   = models.DurationField(default=timedelta)
  cd_remaining_time       = models.TimeField(default="00:00:00",blank=True)
  cd_remaining_time_delta = models.DurationField(default=timedelta)

  def convert_to_delta(self,time_in):
    hold_time = time_in.strftime("%H:%M:%S")
    t = datetime.strptime(hold_time,"%H:%M:%S")
    return(timedelta(hours=t.hour, minutes=t.minute, seconds=t.second))

  def calculate_time(self):
    cd_total_time_delta = self.convert_to_delta(self.cd_total_time)
    cd_total_run_time_delta = timedelta(minutes=0)
    for track in self.cd_tracks.all():
      cd_total_run_time_delta += track.trk_length_time_delta
      track.trk_run_time_delta += cd_total_run_time_delta
      track.trk_run_time = f"{track.trk_run_time_delta}"
      track.trk_remaining_time_delta = cd_total_time_delta - cd_total_run_time_delta
      track.trk_remaining_time = f"{track.trk_remaining_time_delta}"

    self.cd_run_time_delta = cd_total_run_time_delta
    self.cd_run_time = f"{self.cd_run_time_delta}"
    self.cd_remaining_time_delta = self.cd_total_time_delta - cd_total_run_time_delta
    self.cd_remaining_time = f"{abs(self.cd_remaining_time_delta)}"

  def save(self, *args, **kwargs):
    self.calculate_time()
    super().save(*args,**kwargs)

  def __str__(self):
    return f"{self.artist_name} : {self.cd_title}"

class Track(models.Model):
  cd_id = models.ForeignKey(Cd, on_delete=models.CASCADE,
    related_name='cd_tracks',
  )
  track_title   = models.CharField(max_length=50)
  track_number  = models.IntegerField()
  trk_length_time     = models.TimeField(null=True,default=None, blank=True)
  trk_length_time_delta = models.DurationField(default=timedelta)
  trk_run_time         = models.TimeField(default="00:00:00",blank=True)
  trk_run_time_delta   = models.DurationField(default=timedelta)
  trk_remaining_time       = models.TimeField(default="00:00:00",blank=True)
  trk_remaining_time_delta = models.DurationField(default=timedelta)

  def calculate_track_delta(self):
      self.trk_length_time_delta = self.cd_id.convert_to_delta(self.trk_length_time)

  def save(self, *args, **kwargs):
      self.calculate_track_delta()
      super().save(*args,**kwargs)
      self.cd_id.save()

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

当我试图通过输入曲目长度、时间、名称等并按submit来更新曲目时,它应该计算每个曲目的所有曲目数据。它会计算CD的总运行时间和剩余时间,但不会更新曲目值。我认为我的代码实际上没有正确引用实际对象?或者父级未保存子级数据…(我将如何编写该数据?)

谢谢 这就是实际的父更新表单的样子:
Update CD Form

我通过管理员手动输入的运行时间,看看是否有帮助(没有)。剩余时间应为总时间减去运行时间(当然,每个轨道的运行时间都会增加)

以下是模板本身:

{% extends 'base.html' %}
{% load static %}
{% block title %} Update CD {% endblock title %}
{% block content %}
<h1>CD Update </h1>

{% if submitted %}
  <p>
    Your CD information  was submitted successfully. Thank You.
  </p>

{% else %}
  <form action="" method="post" novalidate>
  <table>
    {{ form.as_table }}
    {% if not cd.cd_tracks.all %}
      No Tracks Added
    {% else %}
      <TABLE BORDER="0" TABLE_LAYOUT="fixed" WIDTH="100%">
      <TR BGCOLOR="#B0B0FF">
        <TD></TD>
        <TD ALIGN="Center">&nbsp;Track #</TD>
        <TD ALIGN="Center"> Cut Title</TD>
        <TD ALIGN="Center">Track Length</TD>
        <TD ALIGN="Center" BGCOLOR="#CC99CC">Run Time</TD>
        <TD ALIGN="Center" BGCOLOR="#CC99CC">Time Remaining</TD>
      </TR>
      {% for tracks in cd.cd_tracks.all %}
          <TR>
            <TD ALIGN="Center" rowspan="1" height="33" width="33">
              <!--    Turning Off anchor No mix view yet
              <A href=" url 'cd_mixed_view' cd.pk tracks.pk ">
              -->
              <IMG SRC="{% static 'images/edit.gif' %}">
              </A>
            </TD>
            <TD ALIGN="Left" VALIGN="Top" WIDTH="10">&nbsp;{{ tracks.track_number }}</TD>
            <TD ALIGN="Left" VALIGN="Top">&nbsp;{{ tracks.track_title }}</TD>
            <TD ALIGN="Left" VALIGN="Top">{{ tracks.trk_length_time|time:"H:i:s" }}</TD>
            <TD ALIGN="Left" VALIGN="Top">{{ tracks.trk_run_time|time:"H:i:s" }}</TD>
            {% if tracks.trk_remaining_time_delta < "00:00:00" %}
              <TD BGCOLOR="#8DF1BF" ALIGN="Left">&nbsp;(-{{ tracks.trk_remaining_time|time:"H:i:s" }})</TD>
            {% else %}
              <TD BGCOLOR="#8DF1BF" ALIGN="Left">&nbsp;{{ tracks.trk_remaining_time|time:"H:i:s" }}</TD>
            {% endif %}
          </TR>
        {% endfor %}
      </TABLE>
    {% endif %}
    <tr>
      <td><input type="submit" value="Submit"></td>
    </tr>
  </table>
  {% csrf_token %}
  </form>
{% endif %}
{% endblock content %}

1条回答
网友
1楼 · 发布于 2024-05-01 21:50:56

密码很接近。最主要的问题是我没有正确地将子模型保存在父模型中(或者根本没有)。 Uddate模型为:

class Cd(models.Model):
  artist_name    = models.CharField(max_length=155)
  cd_title       = models.CharField(max_length=155)
  cd_total_time           = models.TimeField(default="00:00:00")
  cd_total_time_delta     = models.DurationField(default=timedelta)
  cd_run_time         = models.TimeField(default="00:00:00",blank=True)
  cd_run_time_delta   = models.DurationField(default=timedelta)
  cd_remaining_time       = models.TimeField(default="00:00:00",blank=True)
  cd_remaining_time_delta = models.DurationField(default=timedelta)

  def convert_to_delta(self,time_in):
    hold_time = time_in.strftime("%H:%M:%S")
    t = datetime.strptime(hold_time,"%H:%M:%S")
    return(timedelta(hours=t.hour, minutes=t.minute, seconds=t.second))

  def calculate_time(self):
    cd_total_time_delta = self.convert_to_delta(self.cd_total_time)
    cd_total_run_time_delta = timedelta(minutes=0)
    for track in self.cd_tracks.all():
      cd_total_run_time_delta += track.trk_length_time_delta
      track.trk_run_time_delta = cd_total_run_time_delta
      track.trk_run_time = f"{track.trk_run_time_delta}"
      track.trk_remaining_time_delta = cd_total_time_delta - cd_total_run_time_delta
      track.trk_remaining_time = f"{abs(track.trk_remaining_time_delta)}"
      super(Track,track).save()

    self.cd_run_time_delta = cd_total_run_time_delta
    self.cd_run_time = f"{self.cd_run_time_delta}"
    self.cd_remaining_time_delta = self.cd_total_time_delta - cd_total_run_time_delta
    self.cd_remaining_time = f"{abs(self.cd_remaining_time_delta)}"

  def save(self, *args, **kwargs):
    self.calculate_time()
    super().save(*args,**kwargs)

相关问题 更多 >