chan

朝生暮死不足笑 但悲百年不足道

【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 列表。这个属性并不是表单字段(如 urlcount),而是一个普通的Python属性,用于存储与表单相关的额外数据。

详细解释:

  1. price_count_list 的生成
  • __init__ 方法中,代码首先查询了 PricePolicy 模型中的所有记录,并按 count 字段排序。
  • 然后,代码遍历这些记录,计算每条记录的单价(unit_price = item.price / item.count),并将相关信息存储在 price_count_list 列表中。
  • price_count_list 是一个列表,其中每个元素也是一个列表,包含三个部分:
    • item.count:表示数量。
    • 一个格式化字符串,如 ">={} ${}/条",用于显示给用户。
    • unit_price:表示单价。
  1. self.price_count_list = price_count_list
  • 这一行代码将 price_count_list 列表赋值给 self.price_count_list
  • self 指的是当前 OrderModelForm 的实例。
  • 通过这行代码,price_count_list 列表被存储为 OrderModelForm 实例的一个属性。
  1. 为什么需要这个属性
  • 这个属性可以在表单的其他方法或模板中使用。例如,你可能希望在模板中显示这些价格信息,或者在表单的验证逻辑中使用这些数据。
  • 由于 price_count_list 不是表单字段,它不会直接显示在表单中,但可以通过 self.price_count_list 在表单的其他部分访问。
  1. 与表单字段的区别
  • 表单字段(如 urlcount)是用户在表单中直接输入或选择的数据。
  • 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 实例添加一个自定义属性,用于存储与表单相关的额外数据。这个属性可以在表单的其他方法或模板中使用,但它本身并不是一个表单字段。

评论
还没有评论
    发表评论 说点什么