我正在研究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>
答案 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="">