Это довольно общая проблема, и у меня до сих пор не было возможности отлаживать ее после прочтения документации по Django или каких-либо других связанных с этим ответов на этом сайте.
Моя проблема заключается в следующем, и я опубликую код, чтобы люди могли также увидеть, чего я пытаюсь достичь.
У меня есть следующие модели
class Tournament(models.Model):
name = models.CharField(max_length=128, null=True)
description = models.CharField(max_length=2000, null=True)
number_players = models.IntegerField(default=-1)
teams_per_game = models.IntegerField(default=-1)
template = models.IntegerField(default=-1)
created_by = models.ForeignKey('Player')
created_date = models.DateTimeField(auto_now=True)
number_rounds = models.IntegerField(default=-1)
is_finished = models.BooleanField(default=False)
has_started = models.BooleanField(default=False)
players_per_team = models.IntegerField(default=1)
private = models.BooleanField(default=False,db_index=True)
start_option_when_full = models.BooleanField(default=True)
host_sets_tourney = models.BooleanField(default=False)
max_players = models.IntegerField(default=-1)
template_settings = models.TextField()
@property
def time_since_created(self):
print("Here!")
fmt = '%H:%M:%S'
td = datetime.strptime(datetime.now(), fmt) - datetime.strptime(self.created_date, fmt)
vars(td)
print ("Hours: {}".format(td.hours))
print ("Minutes: {}".format(td.minutes))
print ("Seconds: {}".format(td.seconds))
if td.hours > 0:
return td.hours + " hours ago"
if td.minutes > 0:
return td.minutes + " minutes ago"
if td.seconds > 0:
return td.seconds + " seconds ago"
def __str__(self):
return "Tournament: " + self.name
class SwissTournament(Tournament):
type = models.CharField(max_length=255, default="Swiss")
max_rating = models.IntegerField(default=0)
min_rating = models.IntegerField(default=0)
best_record = models.CharField(max_length=10, null=True)
max_teams = 128
min_teams = 16
Когда я делаю это в моем представлении:
def index(request):
context = {}
try:
swiss_tournaments = SwissTournament.objects.filter(private=False).values()[:20]
if swiss_tournaments.count() > 0:
context.update({'swiss_tournaments': swiss_tournaments})
#for t in swiss_tournaments:
# calling time_since_created set's time_since in our objects
return render(request, 'index.html', context)
except ObjectDoesNotExist:
log("No open tournaments", LogLevel.informational)
return render(request, 'index.html', context)
Я получаю свои объекты швейцарского турнира с нулевым выпуском, и яможет отображать все свойства, кроме time_since_created ... Я даже не вижу операторов печати в моем стандартном выводе на моем устройстве dev, как я везде в своем коде.
Код шаблона:
{% for swiss_t in swiss_tournaments %}
<div class="card-body">
<a class="card-link" href="#">
<span class="card-title h5"> {{ swiss_t.name }} </span><span class="text-muted h7 mb-2"> <i class="fa fa-clock-o"></i>{{ swiss_t.time_since_created }}</span></span>
</a>
<p class="card-text">
{{ swiss_t.description }}
</p>
<div>
<span class="badge badge-primary">{{ swiss_t.created_by.name }}</span>
<a href="https://warzone.com/MultiPlayer?TemplateID={{ swiss_t.template }}" target="_blank"><span class="badge badge-primary">Template {{ swiss_t.template }}</span></a>
<span class="badge badge-primary">Max Players: {{ swiss_t.max_players }}</span>
<span class="badge badge-primary">Node.js</span>
<span class="badge badge-primary">Ruby</span>
<span class="badge badge-primary">Paython</span>
</div>
</div>
{% endfor %}
Я даже пытался создать дочерний класс @property и сослаться на родительский класс (или просто вычислить его там) ... не повезло, метод никогда не вызывается.
Кто-нибудь знает, что я могу сделать для дальнейшей отладки, или у вас есть идеи, как я могу ссылаться на @property, подобный этому, в представлении после загрузки объектов?