如何从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

我对python和django很陌生,如果这个话题已经涉及到了,我很抱歉,但是我找不到我的问题的答案

我的模特上过这些课

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)