我是Django的新手,我正在努力学习。我最终陷入了无法弄清楚最佳前进方向的情况。
来自models.py的片段:
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()
答案 0 :(得分:0)
您应该尝试将条件<p>Architect: {{ metadata.architect }}</p>
或某些条件中的{% if metadata.architect != '' %}
文章包裹起来。
答案 1 :(得分:0)
尝试使用其他ProjectMeta模型。看一下这个。
class ProjectMeta(models.Model):
project = models.ForeignKey(Project)
name = models.CharField(max_length=50)
value = models.TextField()
此查询应该有效。 myproject.projectmeta_set.filter(name="status")
答案 2 :(得分:0)
如果是default
或default_if_none
,您可以使用内置的None
或empty string
模板过滤器来显示默认值。
{% for metadata in projectmeta_list %}
<p>Architect: {{ metadata.architect|default:"-" }}</p>
{% endfor %}
查看this了解详情。