Django检查对象的属性值

时间:2015-02-02 22:51:06

标签: python django django-views

我有两个类似的模型,其类型属性等于“taxi”或“bus”,我想检查一个对象是否是我的上下文处理器中的出租车或总线。 我试过了

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)

用户只能将“taxi”或“bus”作为字符串添加到类型字段中。

的观点:

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)

我如何检查是公共汽车还是出租车? 感谢。

2 个答案:

答案 0 :(得分:1)

我认为 可能是直截了当的,我觉得你的工作比你需要的要困难得多。这应该有效:

在视图代码中:

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 %}

如果不能解决问题,会出现什么问题?您确定所有“元素”对象都具有“类型”属性吗?

答案 1 :(得分:1)

我不知道您是如何使用上下文处理器的,但这不能用作模板中的函数。在开始呈现模板之前,上下文处理器会在模板中更改上下文。

一个简单的解决方案是向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 %}