我如何 link 我的模型到它的外键和 django 模板中的 manytomany 字段?

How do I link to my model to its foreign key and manytomany fields in the templates in django?

我是 django 的新手,有一个相当基本的问题,但是我无法在网上找到我的答案,如果之前有人回答过,我深表歉意...

我有 3 个模型:

class Type(models.Model):
    name = models.CharField(max_length=100)

class Exercise(models.Model):
    name = models.CharField(max_length=100)
    type = models.ForeignKey(Type, on_delete=models.CASCADE, default=1)

class Area(models.Model):
    name = models.CharField(max_length=100)
    notes = models.TextField(blank=True, null=True)
    exercise = models.ManyToManyField(Exercise)

和 3 次浏览:

class AreaView(ListView):
    model = Area
    template_name = 'workouts/areas.html'
    context_object_name = 'areas'

    def get_context_data(self, **kwargs):
        context = super(AreaView, self).get_context_data(**kwargs)
        return context

class ExerciseView(ListView):
    model = Area
    template_name = 'workouts/exercises.html'
    context_object_name = 'exercises'

    def get_context_data(self, **kwargs):
        context = super(ExerciseView, self).get_context_data(**kwargs)
        return context

class TypeView(ListView):
    model = Exercise
    template_name = 'workouts/types.html'
    context_object_name = 'types'

    def get_context_data(self, **kwargs):
        context = super(TypeView, self).get_context_data(**kwargs)
        return context

我已将每个视图注册到一个 url,如下所示:

urlpatterns = [
    path('', AreaView.as_view(), name='areas'),
    path('exercises/<int:id>', ExerciseView.as_view(), name='exercises'),
    path('types/<int:id>', TypeView.as_view(), name='types'),
]

并创建了 3 个模板,areas.html:

{% for area in areas %}
    <ul>
        <li><a href="{% url 'exercises' id=area.id %}">{{ area.name }}</a></li>
    </ul>
{% endfor %}

exercises.html:

{% for area in areas %}
    <ul>
        <li><a href="{% url 'types' id=exercise.id %}">{% for exercise in area.exercise.all %}{{ exercise }}{% endfor %}</a></li>
    </ul>
{% endfor %}

和types.html:

{% for exercise in exercises %}
    <ul>
        <li>{% for type in exercise.type.all %}{{ type}}{% endfor %}</li>
    </ul>
{% endfor %}

我在管理员的每个区域添加了特定的练习,以及每个练习的特定类型。我想要做的是在 areas.html 中显示所有区域的完整列表,然后 link 到 exercises.html 中相应练习的列表,然后 link到显示每个练习对应类型的页面。希望这是有道理的...我尝试过使用不同的命名约定来处理上下文和循环等,但到目前为止,没有任何事情能按照我想要的方式解决。

我是否需要在视图中定义查询集,还是我做错了什么?

为此,您可以使用 DetailView。

class AreaDetailView(DetailView):
    model = Area
    context_object_name = 'area'
    template_name = 'exercises.html'

并将此详细视图映射到 url,就像这样。

path('area/<int:pk>/detail/', AreaDetailView.as_view(), name='area_detail'),

现在您可以在您的模板中 link 这个 url。

{% for area in areas %}
    <ul>
        <li><a href="{% url 'area_detail' area.pk %}">{{ area.name }}</a></li>
    </ul>
{% endfor %}

现在在exercise.html你可以像这样得到这方面的相关练习。

{% for exercise in area.exercise_set.all %}
    <ul>
        <li><a href="{% url 'exercise_detail' id=exercise.id %}">{{ exercise.name }}</a></li>
    </ul>
{% endfor %}

同样,您可以对 ExerciseDetailView 使用类似的方法