简体   繁体   中英

Django dealing with a model fields

I'm new to Django and I'm trying to learn as I go. And I've ended up in a situation where I can't figure out what is the best way forward.

snippet from 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)

And this is the view:

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

But if I want to output ProjectMeta in the template I could iterate over projectmeta_list .

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

But this require alot of repeating myself, and I wont work. Because lets say the architect field is empty, I would get Archiect: printed to the page. Is there a built-in way of converting a model into a dict or list, so I can iterate over it and only print out fields that aren't empty to the page?

I've been looking at get_fields(), would that work? https://docs.djangoproject.com/en/1.10/ref/models/meta/#retrieving-all-field-instances-of-a-model

I tried this in the shell, threw me and AttributeError:

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

您应该尝试将<p>Architect: {{ metadata.architect }}</p>包裹在有条件的{% if metadata.architect != '' %}或达到该效果的某些条件中。

Try with another ProjectMeta model. Take a look at this one.

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

And this query should work. myproject.projectmeta_set.filter(name="status")

You can use built-in default or default_if_none template filters to show a default value if it is None or empty string .

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

Check this for more details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM