【Django】为模型生成辅助字段
背景:有一个价格策略表,只有两个字段,price和count
现在,需要计算单价,及price/count
代码如下
class OrderModelForm(BootStrapForm,forms.ModelForm):
class Meta:
model = models.Order
fields = ['url','count']
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
price_count_list = []
text_count_list = []
queryset = models.PricePolicy.objects.all().order_by('count')
for item in queryset:
unit_price = item.price / item.count
price_count_list.append([item.count,">={} ${}/条".format(item.count,unit_price),unit_price])
text_count_list.append(">={} ${}/条".format(item.count,unit_price))
self.fields['count'].help_text = "||".join(text_count_list)
self.price_count_list = price_count_list
——————————-
在Django中,self.price_count_list = price_count_list 这一行代码的作用是为 OrderModelForm 实例添加一个自定义属性 price_count_list,并将其值设置为 price_count_list 列表。这个属性并不是表单字段(如 url 或 count),而是一个普通的Python属性,用于存储与表单相关的额外数据。
详细解释:
price_count_list的生成:
- 在
__init__方法中,代码首先查询了PricePolicy模型中的所有记录,并按count字段排序。 - 然后,代码遍历这些记录,计算每条记录的单价(
unit_price = item.price / item.count),并将相关信息存储在price_count_list列表中。 price_count_list是一个列表,其中每个元素也是一个列表,包含三个部分:item.count:表示数量。- 一个格式化字符串,如
">={} ${}/条",用于显示给用户。 unit_price:表示单价。
self.price_count_list = price_count_list:
- 这一行代码将
price_count_list列表赋值给self.price_count_list。 self指的是当前OrderModelForm的实例。- 通过这行代码,
price_count_list列表被存储为OrderModelForm实例的一个属性。
- 为什么需要这个属性:
- 这个属性可以在表单的其他方法或模板中使用。例如,你可能希望在模板中显示这些价格信息,或者在表单的验证逻辑中使用这些数据。
- 由于
price_count_list不是表单字段,它不会直接显示在表单中,但可以通过self.price_count_list在表单的其他部分访问。
- 与表单字段的区别:
- 表单字段(如
url和count)是用户在表单中直接输入或选择的数据。 price_count_list是一个辅助属性,用于存储与表单相关的额外信息,这些信息通常不会由用户直接输入,但可能在表单的处理过程中使用。
示例使用场景:
假设你希望在模板中显示这些价格信息,你可以在视图函数中将表单实例传递给模板,然后在模板中访问 price_count_list:
# views.py
def my_view(request):
form = OrderModelForm()
return render(request, 'my_template.html', {'form': form})
<!-- my_template.html -->
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<ul>
{% for item in form.price_count_list %}
<li>{{ item.1 }}</li>
{% endfor %}
</ul>
<button type="submit">Submit</button>
</form>
在这个例子中,form.price_count_list 被用来在模板中显示价格信息。
总结:
self.price_count_list = price_count_list 这一行代码的作用是为 OrderModelForm 实例添加一个自定义属性,用于存储与表单相关的额外数据。这个属性可以在表单的其他方法或模板中使用,但它本身并不是一个表单字段。