无法在Django应用上显示外键属性

时间:2019-07-12 17:31:34

标签: python django

我的数据库中有两个模型。 它们是:-

  • 模块
  • 主题

主题是模块的外键。

这是我的模特。py

from django.db import models

class Modules(models.Model):
    name = models.CharField(max_length=500,null=False)
    def __str__(self):
        return self.name

class Topics(models.Model):
    modules = models.ForeignKey(Modules,on_delete=models.CASCADE)
    name = models.CharField(max_length=500)

这是我的HTML代码:-

{% extends "algorithms/header.html" %}

{% block content %}  
{% if all_topics %}  
    <div class="row">
      {% for topic in modules.topics_set.all %}
      <div class="col s12 m6">
        <div class="card cyan lighten-4">
          <div class="card-content black-text">
            <span class="card-title"><b>{{ topic.name }}</b></span>            <p>{{topic.algorithm_content|safe}}</p>
          </div>
          <div class="card-action">
            <a href="/algorithms/{{ module_name }}/{{ topic.name }}/">View</a>
          </div>
        </div>
      </div>
      {% endfor %}
    </div>
{% else %}
  <h3>The admin has not uploaded any courses yet</h3>
{% endif %}
{% endblock %}

这是我的views.py all_topics包含数据库中的所有主题。

#Import Dependencies
from django.http import HttpResponse,Http404
from .models import Modules,Topics
from django.shortcuts import render

def index(request):
    all_modules = Modules.objects.all()
    html = ''
    context = {
        'all_modules':all_modules,
    }
    return render(request,'algorithms/home.html',context)

def topic(request,module_name):
    print(module_name)
    all_topics = Topics.objects.all()
    all_modules = Modules.objects.all()
    try:
        module = Modules.objects.get(name=module_name)
    except Modules.DoesNotExist:
        raise Http404("Module does not exist.")
    context = {
        'all_topics' : all_topics,
        'module_name' : module_name
    }
    return render(request,'algorithms/topic.html',context)

我看不到“主题”模型的任何数据。

1 个答案:

答案 0 :(得分:0)

这里的问题与外键无关。这是因为视图和模板之间的命名完全缺乏一致性。

您的topic视图将两件事发送到模板:all_topics(这是数据库中所有Topics项的列表)和module_name(这是一个字符串)。在该视图中定义的另外两件事-all_modulesmodule-被简单地丢弃了。 (请注意,偶数视图本身似乎被错误命名,因为它查询的是模块而不是主题。)

然后,在视图中,您在if上有一个all_topics条件,但是在该块内,您尝试遍历modules.topics_set.all。但是modules从未定义;它肯定不会发送到模板,但是视图中甚至没有该名称的变量。

也许您打算做的是定义一个module视图,该视图将特定的模块发送到模板,然后对其进行迭代?如果是这样,那是您应该做的。

def module(request, module_name):
    all_topics = Topics.objects.all()
    try:
        module = Modules.objects.get(name=module_name)
    except Modules.DoesNotExist:
        raise Http404("Module does not exist.")
    context = {
        'all_topics': all_topics,
        'module': module
    }
    return render(request,'algorithms/topic.html', context)

,然后在模板中直接对其进行迭代:

{% block content %}  
    <div class="row">
      {% for topic in module.topics_set.all %}
      <div class="col s12 m6">
        <div class="card cyan lighten-4">
          <div class="card-content black-text">
            <span class="card-title"><b>{{ topic.name }}</b></span>
            <p>{{topic.algorithm_content|safe}}</p>
          </div>
          <div class="card-action">
            <a href="/algorithms/{{ module_name }}/{{ topic.name }}/">View</a>
          </div>
        </div>
      </div>
  {% empty %}
    <h3>The admin has not uploaded any courses yet</h3>
  {% endfor %}
  </div>

请注意从modulesmodule的更改,并使用for...empty而不是if