Шаблоны Django: цикл и печать всех доступных свойств объекта?
У меня есть объект базы данных manor_stats
, содержащий около 30 полей. Для большинства строк большинство этих полей будут пустыми.
В моем шаблоне я хотел бы просмотреть все поля в строке и распечатать информацию только для полей, которые не равны нулю.
Например, есть поле под названием "name": я бы хотел напечатать <li>Name: {{ manor_stats.name }}</li>
в шаблоне ТОЛЬКО для тех объектов, где это поле не равно null. В идеале я хотел бы просто "или": "Откуда:", а не указывать его.
Я знаю, что я мог бы использовать {% if manor_stats.name %}
, чтобы проверить, является ли каждое поле нулевым, но я не хочу делать это 30 раз для всех полей.
Вот что у меня есть в views.py:
manor_stats = Manors.objects.get(idx=id)
return render_to_response('place.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request))
И затем в place.html, я хотел бы иметь что-то, что работает примерно так (псевдокод, с символом, указывающим биты, которые я не знаю, как это сделать):
{% if manor_stats %}
<ul>
{% for manor_stats.property??? in manor_stats %}
{% if manor_stats.property %}
<li>{{ manor_stats.property.field_name??? }} {{ manor_stats.property.value??? }}</li>
{% endif %}
{% endfor %
{% endif %}
Надеюсь, что это имеет смысл...
Ответы
Ответ 1
Вы можете добавить метод в свою модель Manors, которая вернет все значения поля, оттуда вы можете просто перебрать эти значения в вашем шаблоне, проверяя, не имеет ли значение значение null.
- models.py
class Manors(models.Model)
#field declarations
def get_fields(self):
return [(field.name, field.value_to_string(self)) for field in Manors._meta.fields]
- manor_detail.html
{% for name, value in manor_stats.get_fields %}
{% if value %}
{{ name }} => {{ value }}
{% endif %}
{% endfor %}