Django - Как отобразить свойство родительской модели в шаблоне - PullRequest
0 голосов
/ 17 декабря 2018

Это довольно общая проблема, и у меня до сих пор не было возможности отлаживать ее после прочтения документации по 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, подобный этому, в представлении после загрузки объектов?

1 Ответ

0 голосов
/ 17 декабря 2018

Вы использовали метод values() в своем запросе, что означает, что вместо отправки набора запросов экземпляров модели в шаблон, вы отправляете список диктов.Поэтому у отдельных объектов нет методов, определенных в моделях.

Вам следует избегать values, если у вас нет веских причин, которых у вас нет.Используйте фактический набор запросов:

swiss_tournaments = SwissTournament.objects.filter(private=False)[:20]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...