对于这个模板,一切都会很好,但只适用于第一道菜。如果我为其他课程添加讲座,模板将不会显示它们。
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作为链接。
答案 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>