【问题标题】:How to perform calculation on a model attribute with input for form in django如何在 django 中使用表单输入对模型属性执行计算
【发布时间】:2019-08-26 20:30:40
【问题描述】:

我是 Python/Django 的新手,但工作很努力

为了训练自己,我正在开发一个简单的视图,它会
- 通过表单获取输入 (DecimalField)
- 将其传递给视图,在视图中根据我的类方法执行计算
- 将其显示在我的模板上,在 InputForm 本身下方和我的其他类/对象属性旁边

++CODE UPDATE++ 表单中的值被截获并通过 {data} 传回模板,但我无法将其传递给 Model 方法...我应该将函数实例化放在视图中的什么位置?或者我的身份有问题...

最后,我的模板看起来像:

<br>
{% for list in list %}<br>
<div> {{ list.price }} <div> <div> {{ list.newprice}} <br><br>

当然是我已经在使用的 css

型号:

class Product(models.Model):
    name = models.CharField(max_length=20)
    cost = models.DecimalField(decimal_places=2, max_digits=5)
    price = models.DecimalField(decimal_places=2, max_digits=5)

    def __str__(self):
        return self.name

    def newprice(self, input):
        newprice = self.price * input
        return newprice

表格:

class MultiplierForm(forms.Form):
    multiplier = forms.IntegerField(label='Your cost')

查看:

def multi(request):
    list = Product.objects.all()
    data = 0
    if request.method == "POST":
        form = MultiplierForm(request.POST or None)
        if form.is_valid():
            data = request.POST.get('value_from_form')

    else : form = MultiForm(request.POST or None)

    p = Product.newprice() ##this code crash the server. 
                           ##If you I it above the else :form the template display
                           ## but crashes when I submit a value with a   
                           ## Function is Missing Argument error
    p(data)

    return render(request, 'viewinventory/multi.html', {'form': form, 'list': list, 'data': data})

++CODE UPDATE++ 表单中的值被截获并通过 {data} 传回模板,但我无法将其传递给 Model 方法...我应该将函数实例化放在视图中的什么位置?或者我有身份问题...... 我希望保持简单,避免进入过滤器等未知领域

【问题讨论】:

  • 您要保存该值还是只想显示它?编辑:另外,您是想根据相同的乘数将列表中的所有价格相乘,还是希望人们能够为不同的产品设置不同的乘数?
  • 我不需要保存输入值。我只需要从 MultiplierForm 中截取它,将其传递给 Model 方法函数(因此它返回一个 list.newprice 值,我可以在模板中显示列表中所有产品的循环)我想我有点迷失了我必须在视图中使用的语法来捕获输入值并将其传递给乘法器方法函数

标签: django model calculation


【解决方案1】:

在 Django 中,有人说“胖模型、瘦视图、愚蠢的模板和实用模块。”

所以基本上你的视图可能很薄,你可以在其他 utility 方法或 model 中编写计算逻辑。

但很明显,您可以在 views.py 中编写代码,也可以在 Model 类/实用程序方法中编写代码。

我建议将您的计算写在其他效用函数或 Django 模型上。作为“瘦视图和胖模型”概念,这将是非常简单的方法。

【讨论】:

    【解决方案2】:

    有几种不同的方法可以做到这一点,但我认为模板过滤器可能是最简单、最灵活的方法。

    获取值:

    首先,要从表单中获取乘数值,您只需从请求中选择它,如下所示:

    multiplier = request.POST.get('multiplier', 1)
    # 1 is set as default value if the value was not found.
    

    然后您可以通过上下文字典将此值传递给您的模板。

    return render(request, 
    'inventory/index.html', {'form': form, 'list': list, 'multiplier': multiplier},)
    

    您的代码如下所示:

    def index(request):
        form = MultiplierForm()
        list = Product.objects.all() 
        multiplier = 0       
    
        if request.method == "POST":
            multiplier = request.POST.get('multiplier', 1)
            form.multiplier = multiplier
    
        return render(request, inventory/index.html', {'form': form, 'list': list, 'multiplier': multiplier},)
    

    创建和使用过滤器:

    现在您需要创建一个可以在模板中使用的自定义过滤器。

    如果您还没有,请在与您的 templates 文件夹相同的目录级别上创建一个名为 templatetags 的文件夹。 (在 templatetags 文件夹中,创建一个名为 __init__.py 的文件。该文件可以为空,但必须存在。) 在 templatetags 文件夹中,创建一个名为 my_tags.py 的文件(名称是可选的),然后在该文件中编写模板标签和过滤器。

    from django import template
    
    register = template.Library()
    
    
    @register.filter
    def new_price(price, multiplier):
        return price * multiplier
    

    然后在模板的顶部,您必须像这样加载模板标签:

    {% load my_tags %}
    

    然后您可以使用这样的过滤器来放置新价格:

    <p>New Price: {{product.price | new_price:multiplier}}</p>
    

    这会将product.price 传递给过滤函数new_price,并将multiplier 作为第二个参数,该函数将返回price * multiplier

    附加:

    现在,如果您只想在设置了乘数的情况下显示新价格,那么您可以像这样修改您的模板:

    {% if multiplier > 0 %}<p>New Price: {{product.price | new_price:multiplier}}</p>{% endif %}
    

    编辑:

    您可以在此处阅读有关模板标签和过滤器的更多信息: https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 2014-03-30
      • 2018-10-15
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2023-02-09
      相关资源
      最近更新 更多