Django中的模板没有为2个路径显示相同的内容

时间:2018-01-18 09:42:47

标签: python django

对于这个模板,一切都会很好,但只适用于第一道菜。如果我为其他课程添加讲座,模板将不会显示它们。

def courses(request, slug):
    con = get_object_or_404(Course, slug=slug)
    context = {
        'course': con,
        'lectures': con.lectures.all(),
        'categories': con.categories.all(),
    }
    return render(request, 'courses/courses.html', context)
<ul>
        {% for a in categories %}
            <li><strong>{{ a.course_category }}</strong></li>
            {% for c in lectures %}
                {% if a == c.course_category %}
                    <li>{{ c.lecture_title }}</li>
                    <li>{{ c.content }}</li>
                    {% if c.link %}
                        <li>{{ c.link }}</li>
                    {% endif %}
                    {% if c.file %}
                        <li><a href='{{ MEDIA_URL }}{{ c.file.url }}'>download</a></li>
                    {% endif %}
                {% endif %}
            {% endfor %}
        {% endfor %}
    </ul>

class Course(models.Model):
    study_programme = models.ForeignKey('StudyProgramme', on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    ects = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
    description = models.TextField()
    year = models.PositiveSmallIntegerField(validators=[MaxValueValidator(99)])
    semester = models.IntegerField(choices=((1, "1"),
                                            (2, "2"),
                                            ), default=None)
    slug = models.SlugField(max_length=140, unique=True)

    def __str__(self):
        return self.name

    def _get_unique_slug(self):
        slug = slugify(self.name)
        unique_slug = slug
        num = 1
        while Course.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, num)
            num += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self._get_unique_slug()
        super().save()

class CourseCategory(models.Model):
course = models.ForeignKey('Course', on_delete=models.CASCADE, related_name='categories')
course_category = models.CharField(max_length=50, unique=True)

def __str__(self):
    return self.course_category


class Lecture(models.Model):
course = models.ForeignKey('Course', on_delete=models.CASCADE, default='', related_name='lectures')

这是我的models.py中提供的课程模型。它使用slug作为链接。

2 个答案:

答案 0 :(得分:0)

我认为您的Lecture模型存在问题。

为什么Lecture模型的课程字段为default=''

它应该是您的Courcse模型对象之一。如果要添加默认值,可以像这样使用

DEFAULT_COURSE = 1
class Lecture(models.Model):
    course = models.ForeignKey('Course', on_delete=models.CASCADE, default=DEFAULT_COURSE, related_name='lectures')

答案 1 :(得分:0)

希望这会有所帮助:

您需要两个视图,每个视图只执行他们实际需要的数据库查询并处理所有数据准备。 通过这种方式,您可以获得漂亮而干净的模板。

第一次观看: /courses

def courses(request):
    queryset = Course.objects.all()
    context = {'courses':queryset}
    return render(request, 'courses/courses.html', context)

此模板(courses.html):

<ul>
{% for i in courses %}
    <li>
        <a href={{ i.slug }}>{{ i }}</a>
    </li>
{% endfor %}
</ul>

第二个视图: /courses/course_name

def course_detail(request, course_name):
    query = Course.object.get(name=course_name)
    context = {'lectures':query.lectures.all(),'categories':query.categories.all()}
    return render(request, 'courses/course_detail.html', context)

此模板(course_detail.html):

<p><strong>Categories</strong></p>
<ul>
    {% for c in categories %}
        <li>{{ c.course_category }}<li>
    {% endfor %}
</ul>
<p><strong>Lectures</strong></p>
<ul>
    {% for l in lectures %}
        <li>{{ l.lecture_title }}</li>
        <li>{{ l.content }}</li>
        {% if l.link %}
            <li>{{ l.link }}</li>
        {% endif %}
        {% if l.file %}
            <li><a href='{{ MEDIA_URL }}{{ l.file.url }}'>download</a></li>
        {% endif %}
        <hr>
    {% endfor %}
</ul>