如何将Form输入作为变量传递给我的类方法

时间:2019-04-12 21:28:52

标签: python django

简短的问题:如何将用户输入的表单信息传递给方法类的参数?

用户键入一个数字,该数字用于方法中以乘以“类别”字段中的另一个值。

我尝试了很多事情,但无法弄清楚我做错了什么 如果我更新方法以使用常量而不是变量,那么一切都会在模板上呈现出我想要的样子

我一直遇到缺少位置参数错误的情况。

型号

class Product(models.Model):
    sku = models.CharField(max_length=30)
    price = models.DecimalField(max_digits=5, decimal_places=2)

    def __str__(self):
        return self.sku

    def multi(self, n = 2):      #setting up a default of 2 initiate
        np = self.price * n      #the method and show self.multi in template
        return np              

观看次数

def index(request):
    list = Product.objects.all()

    if request.method == "POST":
        form = Input(request.POST or None)

        if form.is_valid():
            value = request.POST.get('data')
            value = form.cleaned_data.get('data')
            x = Product.multi()           # code broken, it does not 
            x(value)                      # initialize the method

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

表格

class Input(forms.Form):
    data = forms.DecimalField()

template:周围的东西


        {% for item in list %}
        <div>
     {{ item.sku }} {{ item.price }} {{ item.multi }} </div>
{% endfor %}

1 个答案:

答案 0 :(得分:0)

我相信您可以尝试通过模板标签和过滤器来实现。 由于默认情况下您无法通过Django模板系统将参数发送到类实例的方法中,因此您需要使用模板标签来发挥创意。 https://docs.djangoproject.com/en/2.2/howto/custom-template-tags/

我将执行以下操作:

# tags.py
from django import template
register = template.Library()
@register.filter
def multi(product, multiple):
    return product.multi(multiple)

您认为

def index(request):
    list = Product.objects.all()
    value = 2  # some default you want
    form = Input(request.POST or None)
    if request.method == "POST":
        if form.is_valid():
            value = form.cleaned_data.get('data')
    return render(request, 'template.html', {'value': value, 'form': form, 'list': list})

在您的模板中

{% load tags %}
{% for item in list %}
    <div>{{ item.sku }} {{ item.price }} {{ item|multi:value }} </div>
{% endfor %}

value是在表单上输入的值,您可以将其输入到呈现的模板页面的上下文中

希望有帮助