Django:根据字段值从模型返回字段选择?
我正在处理一些我几乎无法控制的数据。我只想返回模型中不确定的“无趣”值(例如“0”、“X”或“-”)的字段,并在模板中单独访问它们 我的模型是这样的:Django:根据字段值从模型返回字段选择?,django,Django,我正在处理一些我几乎无法控制的数据。我只想返回模型中不确定的“无趣”值(例如“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, v
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")
在我的模板中,我返回一个庄园查询集,如果hills字段不是无趣的,我想输出如下内容:
{% for manor in manors %}
{% if manor.hills %}<li>Hills blah blah: {{ manor.hills }}</li>{% endif %}
{% endfor %}
但我不知道如何访问模板中字典的各个值:
{% if manor.get_field_dictionary['hills'] %}<li>Hills blah blah: {{ manor.get_field_dictionary['hills'] }}</li>{% endif %}
试试这个
{% for k,v in manor.get_field_dictionary %}
{% ifequal k "hills" %}
<li>Hills blah blah: {{v}}</li>
{% endifequal %}
{% endfor %}
{manor.get_field_dictionary%}
{%ifk“hills”%}
山上的废话:{{v}
{%endifequal%}
{%endfor%}
假设model方法起作用,那么应该得到您想要的东西。根据您使用的Django版本,您应该使用“in”操作符。让我们看看你的模型函数。让它输出一个列表
def get_field_list(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.value_to_string(self)
return interesting_fields
那么。在模板中执行以下操作
{% if 'hills' in manor.get_field_list %}<li>Hills blah blah: {{ manor.hills }}</li>{% endif %}
谢谢这是可行的,但感觉效率很低,因为我在模型中有30个字段。有没有办法返回一个只附带有感兴趣字段的查询集?谢谢!不幸的是,我不能使用'in'操作符,因为我正在运行Django 1.1。编辑queryset看起来是一种方法。请您再给我一点帮助,我应该把这些代码放在哪里,在models.py或views.py中?如何获取所需的查询集(实际上是一个过滤的查询集),然后将编辑后的查询集返回模板?非常感谢…我认为您在视图中需要它,因为它不处理模型的单个实例。如果你打算经常使用它,也许可以把它分解成一个函数。只需使用常规django db api捕获所需的查询集,然后将其推送到模板上即可。好的-对此很抱歉-因此在views.py中,我现在有:all_manors=manors.objects.filter(structidx_uin=place_id)——对于all_manors中的manor:--但该代码中的field.value_to_string(self)给了我一个错误:“未定义全局名称‘self’”. 我是否应该使用其他东西而不是“self”?只需在不使用self调用的情况下尝试,使用manor实例即可。我认为自我是我这边的一个错误。我编辑了上面的代码以反映这一点。我最终将其作为模型上的一个方法添加到了“returnself”。谢谢你的帮助,我一个人永远也得不到。
def get_field_list(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.value_to_string(self)
return interesting_fields
{% if 'hills' in manor.get_field_list %}<li>Hills blah blah: {{ manor.hills }}</li>{% endif %}
for manor in Manors.objects.all():
for field in Manors._meta.fields:
if field.value_to_string(manor) == "N" or field.value_to_string(manor) == "0" or field.value_to_string(manor) == "-" or field.value_to_string(manor) == "X":
delattr(manor, field.value_to_string(self))