如何访问以下模型表

时间:2018-03-15 19:00:17

标签: django database

我正在研究Django项目,我是初学者。我有一个显示孵化器列表的页面(来自数据库)。当我点击它们时,我想要显示我们为其制作单独的模型类的详细信息。 models.py:

class Incubators(models.Model):      # These are our database files for 

the Incubator Portal
    incubator_name = models.CharField(max_length=30)
    owner = models.CharField(max_length=30)
    city_location = models.CharField(max_length=30)
    description = models.TextField(max_length=100)
    logo = models.FileField()
    verify = models.BooleanField(default = False)

    def get_absolute_url(self):
        return reverse('main:details', kwargs={'pk': self.pk})

    def __str__(self):                  # Displays the following  stuff when a query is made
      return self.incubator_name + '-' + self.owner 

class Details(models.Model):
    incubator = models.ForeignKey(Incubators, on_delete = models.CASCADE, related_name='esc_details')
    inc_name = models.CharField(max_length = 30)
    inc_img = models.FileField()
    inc_details = models.TextField(max_length= 2500)
    inc_address = models.TextField(max_length = 600, default = "Address")
    inc_doc = models.FileField()
    inc_policy = models.FileField()

    def __str__(self):
        return self.inc_name

这是我对细节的看法:

def details(request, incubator_id):
    inc = get_object_or_404(Incubators, pk = incubator_id)
    details = Details.objects.all()
    return render(request, 'main/details.html', {'inc': inc, 'details': details})

这是我的urls.py

urlpatterns = [
    url(r'^home/', views.home, name='home'),    # Home page
    url(r'incubators/$', views.incubators, name='incubators'),    # Incubator list page
    url(r'about/', views.about, name='about'),          # Websie about page
    url(r'results', views.result, name = 'result'),         # For search function
    url(r'^incubators/(?P<incubator_id>[0-9]+)', views.details, name = 'details'),      # shows details of incubators
    url(r'incubators/add/$', views.AddIncubator.as_view(), name = 'add-incubator'),     # Adding Inc
]

在我的模板中,我能够在模型中显示Incubator类的数据(例如{{inc.incubator_name}}),但无法使用Details模型。

<!-- Title -->


    <h1 class="mt-4">{{ inc.incubator_name }} <p class="lead">
            by
            <a href="#">{{ inc.owner }}</a>
          </p></h1>

          <!-- Author -->

<hr>

          <!-- Preview Image -->
          <img class="img-fluid rounded" src="{{ inc.inc_img.url }}" alt="">

          <hr>

          <!-- Post Content -->
                    <p class="lead">{{ inc.esc_details.inc_details }}</p>


          <blockquote class="blockquote">
            <p class="mb-0">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
            <footer class="blockquote-footer">Someone famous in
              <cite title="Source Title">Source Title</cite>
            </footer>
          </blockquote>

2 个答案:

答案 0 :(得分:0)

如果定义两个模型之间关系的字段不在您抓取对象的模型中,那么您所做的就是在模型类定义中使用related_name。

class Details(models.Model):
    incubator = models.ForeignKey(Incubators, on_delete = models.CASCADE, related_name='banana_pudding')

然后在您的模板中,您可以使用

{{ inc.banana_pudding.inc_address }}

编辑:所以,我只是注意到这是一对多的关系。我从上下文中假设这是一对一的关系。如果是,你应该使用OneToOneField而不是ForeignKey,然后你可以使用我上面注意到的模板标签。

如果它确实是一对多关系,则会获得一组结果而不是单个条目,这意味着您需要对结果集进行迭代。您可以按如下方式执行此操作:

{% for banana in inc.banana_pudding.all %}
    {{ banana.inc_address }}
{% endfor %}

如果您打算这样做,也可以使用select_related / prefetch_related。它确保一次性从数据库中获取所有您想要的结果,而不是需要由此模板公式引起的多个数据库命中。

答案 1 :(得分:0)

所以我想出了如何访问Detail类元素。它很简单。 您只需在views函数中添加查询。

views.py

def details(request, incubator_id):
    inc = get_object_or_404(Incubators, pk = incubator_id)
    details = Details.objects.get(pk = incubator_id)
    return render(request, 'main/details.html', {'inc': inc, 'details': details})

现在可以使用&#39;详细信息&#39; HTML文件中的变量。

HTML:

<img class="img-fluid rounded" src="{{ details.inc_img.url }}" alt="">