Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 试图通过父函数调用设置相关模型字段_Python_Django - Fatal编程技术网

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

Python 试图通过父函数调用设置相关模型字段,python,django,Python,Django,我正在写一个光盘库编辑例程。应用程序允许您输入CD艺术家姓名、CD标题和CD的总时间。然后,用户可以输入曲目信息。输入曲目信息时,我希望应用程序显示当前运行时间,包括此曲目,以及基于CD长度的剩余时间。模型和功能如下所示 class Cd(models.Model): artist_name = models.CharField(max_length=155) cd_title = models.CharField(max_length=155) cd_total

我正在写一个光盘库编辑例程。应用程序允许您输入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的总运行时间和剩余时间,但不会更新曲目值。我认为我的代码实际上没有正确引用实际对象?或者父级未保存子级数据…(我将如何编写该数据?)

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

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

以下是模板本身:

{% 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 %}
{%extends'base.html%}
{%load static%}
{%block title%}更新CD{%endblock title%}
{%block content%}
光碟更新
{%如果已提交%}

您的CD信息已成功提交。非常感谢。

{%else%} {{form.as_table}} {%if not cd.cd_tracks.all%} 没有轨道添加 {%else%} 跟踪# 剪贴标题 轨道长度 运行时 剩余时间 {cd.cdu tracks.all%}
密码很接近。最主要的问题是我没有正确地将子模型保存在父模型中(或者根本没有)。 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)