Я работаю с некоторыми данными, над которыми у меня мало контроля. Я хотел бы вернуть ТОЛЬКО поля моей модели, которые не являются определенными «неинтересными» значениями (например, «0», «X» или «-»), и обращаться к ним по отдельности в шаблоне.
Моя модель такая:
class Manors(models.Model):
structidx = models.IntegerField(primary_key=True, verbose_name="ID")
hills = models.CharField(max_length=100, null=True, blank=True, verbose_name="Number of fields")
В моем шаблоне я возвращаю QuerySet of Manors, и я хотел бы вывести что-то вроде этого , если поле холмов неинтересно:
{% for manor in manors %}
{% if manor.hills %}<li>Hills blah blah: {{ manor.hills }}</li>{% endif %}
{% endfor %}
Я хочу избежать слишком большой логики в шаблоне. В идеале объект поместья просто не должен возвращаться с присоединенными неинтересными полями, тогда я мог бы просто сделать {% if manor.hills %}
.
---- ОБНОВЛЕНИЕ ---- Я мог бы использовать словарь, как показано ниже, но он кажется очень неэффективным - было бы лучше вернуть QuerySet только с интересными прикрепленными полями. Это возможно? -----------
Я попытался написать метод модели, который возвращает словарь интересных значений, например:
def get_field_dictionary(self):
interesting_fields = {}
for field in Manors._meta.fields:
if field.value_to_string(self) != "N" and field.value_to_string(self) != "0" and field.value_to_string(self) != "-" and field.value_to_string(self) != "X":
interesting_fields[field.name] = field.value_to_string(self)
return interesting_fields
Но я не знаю, как получить доступ к отдельным значениям словаря в шаблоне:
{% if manor.get_field_dictionary['hills'] %}<li>Hills blah blah: {{ manor.get_field_dictionary['hills'] }}</li>{% endif %}
выдает TemplateSyntaxError. Есть лучший способ сделать это?
ОБНОВЛЕНИЕ : это было сделано в конце, как метод для модели.
def get_interesting_queryset(self):
for field in Manors._meta.fields:
if field.value_to_string(self) is None or field.value_to_string(self) == "N" or field.value_to_string(self) == "0" or field.value_to_string(self) == "-" or field.value_to_string(self) == "X" or field.value_to_string(self) == "":
delattr(self, str(field.name))
return self