我如何 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 使用类似的方法
我是 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 使用类似的方法