Django模板子查询集

时间:2018-07-11 23:35:12

标签: django python-3.x django-models django-templates django-views

我正在尝试显示子模型“ usertraining ”条目中通过外键链接到“ training ”条目的字段。但是第二个查询集usertraining_set似乎不包含任何内容。我想念什么?

我有以下 template 循环:

{% for training in training_list %}
        {% for elem in training.usertraining_set.all %}
        <div class="training">
            <div class="training-info"> 
                <div class="training-main-title">
                    <div class="training-state">{{ elem.state }}</div> 
                    <a href="{% url 'my_app:training_detail' pk=training.pk %}">{{ training.title }}</a>
                </div>
                <div class="training-date">
                    <p>Last trained: {{ elem.last_training_date|date:"D, d M Y, H:i:s" }}</p>
                </div>
                <div class="training-score">
                    Score: <span class="badge btn-circle">{{elem.score}}</span>
                </div>
            </div>
            <img src="{{ training.title_pic.url }}">
        </div>
        {% endfor %}
{% endfor %}

模型

class Training(models.Model):

    title = models.CharField(max_length = 2000, blank = False)


    title_pic = models.ImageField(upload_to = 'training/title_pics', blank = False)


    def __str__(self):
        return self.title

    def get_absolute_url(self):

        return reverse("training_detail",kwargs={'pk':self.pk})

    @property
    def title_pic_url(self):

        if self.title_pic and hasattr(self.title_pic, 'url'):
            return self.title_pic.url

class UserTraining(models.Model):

    user = models.ForeignKey(User,related_name='usertraining',on_delete=models.CASCADE)
    training = models.ForeignKey(Training,related_name='usedtraining',on_delete=models.CASCADE)
    state = (
             ('train', 'train'),
             ('training', 'training...'),
             ('retrain', 'retrain'),
             ('trained','trained')
            )
    state = models.CharField(max_length = 200, choices = state, default = 'train')
    last_training_date = models.DateTimeField(auto_now=True)
    score = models.CharField(max_length = 4, default = '0%')

    def __str__(self):
        """ String representation of Training entry """
        return "{}_{}".format(self.user,self.training)

1 个答案:

答案 0 :(得分:1)

您正在UserTraining模型字段中使用“ related_name”:

user = models.ForeignKey(User,related_name='usertraining',on_delete=models.CASCADE)
training = models.ForeignKey(Training,related_name='usedtraining',on_delete=models.CASCADE)

_set后缀仅在字段没有相关名称时使用,因此在模板中为:

{% for elem in training.usertraining.all %}