【问题标题】:Django change choice before validationDjango 在验证前更改选择
【发布时间】:2020-07-15 12:10:36
【问题描述】:

我正在尝试在 Django 中验证选择字段之前对其进行更新。原因是有问题的选择字段值是我要更新的模型的 ID。

def fuelLogSystemOne(request):
entries = FuelLogSystemOneMod.objects.all().order_by('date')
products = productsMod.objects.all()
if request.method == 'POST':
    form = forms.AddFuelLogOneForm(request.POST, request.FILES)
    productid = form['product'].value()
    product = productsMod.objects.get(id=productid)
    product_id = request.POST.get('product')
    form.fields['product'].choices = [(product.product_type, product.product_type)]
    if form.is_valid():
        bucketsRemoved = form['buckets_added'].value()
        product.stock -= bucketsRemoved
        product.save(['stock'])
        instance = form.save(commit=False)
        instance.staff = request.user
        instance.save()
        return redirect('home')
else:
    form = forms.AddFuelLogOneForm()
return render(request,'systems/fuellogsystemone.html',{'form':form,'entry':entries,'products':products})

下面的部分是我在验证表单数据之前尝试更改表单数据的地方,因此它不会说“选择一个有效的选择”。 1 不是可用的选项之一'

    product_id = request.POST.get('product')
    form.fields['product'].choices = [(product.product_type, product.product_type)]

但是当我第一次提交表单时,它仍然说“选择一个有效的选择”。

Django 在什么时候验证表单,因为我在 is_valid() 方法之前更改了表单并且它仍然遇到这个错误?

【问题讨论】:

    标签: django


    【解决方案1】:

    这应该在您的表单中,您必须重写 init 方法,并在视图中的表单初始化期间传递产品 ID

    forms.py

    class AddFuelLogOneForm(forms.ModelForm):
    
        def __init__(self, *args, **kwargs):
            product = kwargs.pop('product', None)
            self.fields['product'].choices = [(product.product_type, product.product_type)]
    

    views.py

    def fuelLogSystemOne(request):
        entries = FuelLogSystemOneMod.objects.all().order_by('date')
        products = productsMod.objects.all()
        if request.method == 'POST':
            product_id = request.POST.get('product')
            productid = form['product'].value()
            product = productsMod.objects.get(id=productid)
            product_id = request.POST.get('product')
            form = forms.AddFuelLogOneForm(request.POST, request.FILES, product=product)
            if form.is_valid():
                bucketsRemoved = form['buckets_added'].value()
                product.stock -= bucketsRemoved
                product.save(['stock'])
                instance = form.save(commit=False)
                instance.staff = request.user
                instance.save()
                return redirect('home')
        else:
            form = forms.AddFuelLogOneForm()
        return render(request,'systems/fuellogsystemone.html',{'form':form,'entry':entries,'products':products})
    

    【讨论】:

    • 当我尝试这个时,我得到了产品是无类型的错误,并且无法从 forms.py 文件中检索 product_type。这对我来说是 Django 中的一个学习项目,所以我仍然试图了解一些事情,在线form = forms.AddFuelLogOneForm(request.POST, request.FILES, product=product) 的想法是您将对象传递给表单吗?当请求不是 POST 时,是否应该在 forms.py 上导入模型 productsMod?
    • 是的,您必须在forms.py文件中导入产品模型
    猜你喜欢
    • 1970-01-01
    • 2015-11-17
    • 2016-03-01
    • 2011-01-11
    • 2013-09-03
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多