如何从django模板中的相关对象获取值
我对python和django很陌生,如果这个话题已经涉及到了,我很抱歉,但是我找不到我的问题的答案 我的模特上过这些课如何从django模板中的相关对象获取值,django,django-models,django-templates,django-views,Django,Django Models,Django Templates,Django Views,我对python和django很陌生,如果这个话题已经涉及到了,我很抱歉,但是我找不到我的问题的答案 我的模特上过这些课 class Category(models.Model): category_type = models.CharField(max_length=50) description = models.TextField() def __unicode__(self): return self.category_type class A
class Category(models.Model):
category_type = models.CharField(max_length=50)
description = models.TextField()
def __unicode__(self):
return self.category_type
class Area(models.Model):
area_type = models.CharField(max_length=50)
description = models.TextField()
def __unicode__(self):
return self.area_type
class Topic(models.Model):
topic_type = models.CharField(max_length=50)
description = models.TextField()
def __unicode__(self):
return self.topic_type
class Tag(models.Model):
tag_type = models.CharField(max_length=50)
description = models.TextField()
def __unicode__(self):
return self.tag_type
class GenericRecord(models.Model):
document_title = models.CharField(max_length=500)
category = models.ForeignKey("Category")
area = models.ForeignKey("Area")
topic = models.ForeignKey("Topic")
tag = models.ForeignKey("Tag")
note = models.TextField(null=True, blank=True)
link = models.TextField(null=True, blank=True)
file_upload = models.FileField(upload_to='GenericRecord/', null=True, blank=True)
class Meta:
abstract = True
class Document(GenericRecord):
code = models.CharField(max_length=500, null=True, blank=True)
reference = models.CharField(max_length=500)
issue_date = models.DateField(auto_now=False, auto_now_add=False)
validation_date = models.DateField(auto_now=False, auto_now_add=False, null=True, blank=True)
def get_admin_url(self):
return reverse("admin:%s_%s_change" % (self._meta.app_label, self._meta.model_name), args=(self.id,))
def __unicode__(self):
if self.code:
return "%s-%s" % (self.code, self.document_title)
else:
return "--%s" % self.document_title
这段代码位于views.py中
def documents_list(request):
# Generate counts of some of the main objects
num_docs=Document.objects.all().count()
docs=Document.objects.all()
num_articles=Article.objects.all().count()
articles=Article.objects.all()
template='documents_management.html'
for object in docs:
object.fields = dict((field.name, field.value_to_string(object)) for field in object._meta.fields)
# Render the HTML template documents_management.html with the data in the context variable
return render(request,template, context={'docs':docs, 'num_docs':num_docs,'docs':docs, 'num_articles':num_articles, 'articles':articles})
在模板中,我试图得到一个包含所有值的表,但是对于相关对象,我得到了主键(当然)
以下是我的模板中的代码:
<table class="w3-table-all">
{% for object in docs %}
{%if forloop.first %}
<tr>
{% for field, value in object.fields.iteritems %}
<th>{{ field }}</th>
{% endfor %}
</tr>
{%endif%}
{% endfor %}
{% for object in docs %}
{% for field, value in object.fields.iteritems %}
<td>{{ value }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{文档%中对象的%s}
{%if-forloop.first%}
{%为字段,值为object.fields.iteritems%}
{{field}}
{%endfor%}
{%endif%}
{%endfor%}
{文档%中对象的%s}
{%为字段,值为object.fields.iteritems%}
{{value}}
{%endfor%}
{%endfor%}
我的问题是,如何获取对象类别、面积等。。。要获取类别类型、区域类型等值
谢谢 以下是文档中的一个很好的例子: 您正在搜索的是
问题.选项集.all
部分
由于提示样式不好而更新
正如daniel提到的,您应该放弃字段.to\u value\u string
方法
因为我不喜欢隐式代码,所以我总是建议尽可能显式地编写模板,这里将根据我的模板版本
<table class="w3-table-all">
{% for doc in docs %}
{% if forloop.first %}
<tr>
<th>Document Title</th>
<th>Category Type</th>
<th>Area Type</th>
<th>...</th>
</tr>
{% else %}
<tr>
<td>{{ doc.document_title }}</td>
<td>{{ doc.category.category_type }}</td>
<td>{{ doc.area.area_type }}</td>
<td>...</td>
</tr>
{% endif %}
{% endfor %}
</table>
问题在于使用
字段。值到字符串。正如该方法上的docstring所示,这是用于序列化的,而不是用于显示值
一种更简单、更有效的方法是使用getattr
,它获取实际值;然后,模板将负责将这些转换为字符串,在外键的情况下,该字符串将调用相关对象的\uuuuunicode\uuuu
方法
object.fields = dict((field.name, getattr(obj, field.name)) for field in object._meta.fields)
这是反向关系。OP希望展示向前的关系。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-嘿,谢谢你的反馈,你是绝对正确的。我更新了我的答案,希望能弥补它^^@JohannesReichard我明白你的意思。实际上,在我的模板的第一个版本中,我使用了显式代码(即使没有您建议的改进);由于这个项目的开发也是一个练习,我只是好奇如何用另一种方式来做。我现在正试图“排序”这些值。。。感谢您的反馈和建议
object.fields = dict((field.name, getattr(obj, field.name)) for field in object._meta.fields)