Django проверка значения атрибута объекта

78
7

У меня есть две аналогичные модели, которые имеют атрибуты типа, равные "такси" или "шине", и я хочу проверить, является ли объект такси или автобусом в моем текстовом процессоре. Я пытался

if element.type == "bus":

но он не вернулся. Это потому, что это не так прямо, я знаю. Я также попытался преобразовать element.type в str, он показал проблему, но я не знаю, как исправить.

models.py:

class Element(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
name = models.CharField(max_length=20)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
type = models.CharField(max_length=20)

пользователь может добавлять "такси" или "шину" в качестве строк для ввода поля.

Просмотры:

def home(request, id):
site = Site.objects.get(id=id)
elements = Element.objects.filter(site_name=site)

return render_to_response("base.html", locals(), context_instance=RequestContext(request))

base.html:

{% load ttag %}
{% for e in elements %}
{% elements request e.id %}
{% endfor %}

контекстный процессор:

def elements(request, id):
element = Element.objects.get(id=id)
if element.type == "taxi":
list = {'element':element}
return render_to_string("taxi.html", list)
elif element.type == "bus":
list = {'element':element}
return render_to_string("bus.html", list)

Как я могу проверить, автобус или такси? Благодарю.

спросил(а) 2015-02-03T01:51:00+03:00 5 лет, 6 месяцев назад
1
Решение
56

Я думаю, что это, вероятно, так просто, и я чувствую, что вы работаете намного сложнее, чем вам нужно. Это должно работать:

Код вида:

elements = Element.objects.filter(site_name=site)  # or whatever

В шаблоне:

{% for e in elements %}
{% if e.type == 'taxi' %}
<!-- do taxi stuff -->
{% elif e.type == 'bus' %}
<!-- do bus stuff -->
{% endif %}
{% endfor %}

Если это не делает трюк, что пойдет не так? Вы уверены, что все "элементарные" объекты имеют атрибут "type"?

ответил(а) 2015-02-03T03:07:00+03:00 5 лет, 6 месяцев назад
56

Я не знаю, как вы получили идею использования контекстного процессора, но не может использоваться как функция внутри шаблона. Контекстный процессор изменяет контекст внутри шаблона, прежде чем вы начнете визуализировать шаблон.

Легким решением было бы добавить метод к Element и включить шаблон динамически:

class Element(models.Model):
user = models.ForeignKey(User, null=True, blank=True)
name = models.CharField(max_length=20)
timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)
type = models.CharField(max_length=20)

def get_template_name(self):
if self.type == "bus":
return 'bus.html'
if self.type == "taxi":
return 'taxi.html'

В вашем шаблоне:

{% for element in elements %}
{% include element.get_template_name with element=element %}
{% endfor %}

ответил(а) 2015-02-03T05:27:00+03:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема