我在以下课程中有一些列表项
class productConstructor:
def __init__(self, name):
self.product_code = [1,2,3,4]
self.quantity = [70,50,110,10]
self.material = ['wood', 'metal', 'cork', 'cardboard']
我需要做的是遍历类中的每个项目,并从列表中选择第一个项目,以便执行以下操作:
product = productConstructor('product')
我希望能够遍历“产品”并能够访问每个项目列表中的第n个索引。这需要与Flask集成,其代码如下所示:
{% for product in product%}
<div>
<p>{{product.product_code}}</p>
<p>{{product.quantity}}</p>
<p>{{product.material}}</p>
</div>
{% endfor %}
Flask代码应为列表中的每个索引生成一个div。例如,每个对象项目列表中都有4个值,因此我希望发生的事情是有4个看起来像这样的divs
div 1: 产品代码= 1,数量= 70,材料=木材
div 2: 产品代码= 2,数量= 50,材料=金属。
...依次类推3和4。
我可以使用 iter 和 next 函数实现类似的功能吗?
答案 0 :(得分:0)
您可以向__iter__
添加productConstructor
方法,该方法使用zip
对值进行配对,并且yield
s个具有所需属性的对象:
class Product:
def __init__(self, _vals):
self.__dict__ = dict(zip(['product_code', 'quantity', 'material'], _vals))
class productConstructor:
def __init__(self):
self.product_code = [1,2,3,4]
self.quantity = [70,50,110,10]
self.material = ['wood', 'metal', 'cork', 'cardboard']
def __iter__(self):
yield from map(Product, zip(self.product_code, self.quantity, self.material))
然后,在您的flask
应用中:
@app.route('/someroute')
def someroute():
return flask.render_template('my_template.html', products = productConstuctor())
最后,my_template.html
与您的原始照片相同:
{% for product in products%}
<div>
<p>{{product.product_code}}</p>
<p>{{product.quantity}}</p>
<p>{{product.material}}</p>
</div>
{% endfor %}
编辑:map
替代:
class productConstructor:
...
def __iter__(self):
for i in zip(self.product_code, self.quantity, self.material):
yield Product(i) #calling Product explicitly