【问题标题】:Django dealing with a model fieldsDjango 处理模型字段
【发布时间】:2016-12-16 00:53:23
【问题描述】:

我是 Django 新手,我正在努力学习。我最终陷入了一种我无法弄清楚最好的前进方式的情况。

来自models.py的sn-p:

class ProjectMeta(models.Model):
    project = models.ForeignKey(Project)
    architect = models.CharField(max_length=200)
    landscape = models.CharField(max_length=100, blank=True)
    engineer = models.CharField(max_length=200, blank=True)
    client = models.CharField(max_length=100)
    consultant = models.CharField(max_length=100, blank=True)
    size = models.DecimalField(max_digits=5, decimal_places=2, blank=True)
    location = models.CharField(max_length=200)
    date = models.DateField()

    STATUS = (
        ('CP', 'Competition'),
        ('UC', 'Under construction'),
        ('CO', 'Completed'),
    )
    status = models.CharField(max_length=2, choices=STATUS, default=1)

这是视图:

class ProjectDetailView(DetailView):
    model = Project

    def get_context_data(self, **kwargs):
        context = super(ProjectDetailView, self).get_context_data(**kwargs)
        context['projectmeta_list'] = ProjectMeta.objects.all()
        return context

但如果我想在模板中输出 ProjectMeta,我可以遍历 projectmeta_list

{% for metadata in projectmeta_list %}
<p>Architect: {{ metadata.architect }}</p>
{% endfor %}

但这需要大量重复自己,而且我不会工作。因为假设架构师字段为空,所以我会将Archiect: 打印到页面上。有没有一种将模型转换为字典或列表的内置方法,所以我可以迭代它并只打印出页面上不为空的字段?

我一直在研究 get_fields(),这行得通吗? https://docs.djangoproject.com/en/1.10/ref/models/meta/#retrieving-all-field-instances-of-a-model

我在 shell 中尝试了这个,抛出了 AttributeError:

>>> from projects.models import *
>>> Project._projectmeta.get_fields()

【问题讨论】:

    标签: python django model


    【解决方案1】:

    您应该尝试将&lt;p&gt;Architect: {{ metadata.architect }}&lt;/p&gt; 包裹在一个条件{% if metadata.architect != '' %} 或某种条件中。

    【讨论】:

      【解决方案2】:

      尝试使用另一个 ProjectMeta 模型。看看这个。

      class ProjectMeta(models.Model):
          project = models.ForeignKey(Project)
          name = models.CharField(max_length=50)
          value = models.TextField()
      

      这个查询应该可以工作。 myproject.projectmeta_set.filter(name="status")

      【讨论】:

        【解决方案3】:

        如果默认值是Noneempty string,您可以使用内置的defaultdefault_if_none 模板过滤器来显示默认值。

        {% for metadata in projectmeta_list %}
        <p>Architect: {{ metadata.architect|default:"-" }}</p>
        {% endfor %}
        

        查看this了解更多详情。

        【讨论】:

        • 很好,我喜欢这个。我实际上早先正在阅读此内容,但在阅读您的答案之前我认为它没有用。谢谢。
        猜你喜欢
        • 2015-05-22
        • 2017-05-06
        • 2012-05-13
        • 1970-01-01
        • 2016-11-19
        • 2012-12-29
        • 2014-12-01
        • 2016-07-24
        • 1970-01-01
        相关资源
        最近更新 更多