在Django表单中验证之前更改表单值

时间:2013-08-30 13:38:51

标签: python django django-forms

我有一个django表单,在我的视图函数中我这样做:

search_packages_form = SearchPackagesForm( data = request.POST )

我想覆盖一个名为price的表单字段,它会被删除:

price = forms.ChoiceField( choices = PRICE_CHOICES, required = False,widget = forms.RadioSelect )

我想在调用search_packages_form.is_valid()

之前覆盖表单字段

我想到了:

search_packages_form.data['price'] = NEW_PRICE

但它不起作用。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

可能不是Django方式,而是基于https://stackoverflow.com/a/17304350/2730032我猜测在验证之前更改表单值的最简单方法是执行以下操作:

<?php 
    ini_set('display_errors','1'); 
    error_reporting(E_ALL);
    include_once 'dbConnect.php';

    if (connect()){
        global $conn;
        $param = array();
        $totalVoters = 0;

        // get totalVoters from regVoter
        $queryTotalVoters = "SELECT COUNT(*) as totalVoters FROM regVoter";

        $checkRes = $conn->prepare($queryTotalVoters);
        $checkRes->execute();
        $checkRes->bind_result($resTotalVoters);

        while ($checkRes->fetch()){ 
            $totalVoters = $resTotalVoters;
        }


        $queryOBParam = "SELECT p,q,b
                         FROM params
                         WHERE faculty = 'OB'";             

        $checkRes = $conn->prepare($queryOBParam);
        $checkRes->execute();
        $checkRes->bind_result($pOB,$qOB,$bOB);

        while ($checkRes->fetch()){ 
            $param[] = [
                'p'=>$pOB,
                'q'=>$qOB,
                'b'=>$bOB,
                'totalVoters'=>$totalVoters
            ];
        }

        echo json_encode($param);
    }
?>

这有效但我感兴趣的是,如果有人有另一种方式似乎更符合Django,或者如果没有:那么解释为什么。

答案 1 :(得分:2)

您想要的一个窍门就是这样做:

changed_data = dict(request.POST)
changed_data['price'] = NEW_PRICE
search_packages_form = SearchPackagesForm(data = changed_data)

答案 2 :(得分:1)

我的解决方案建立在较早的提案之上。这是一个有效的解决方案,可以在多种情况下使用。

@Milad Khodabandehloo 有一个棘手的解决方案来解决这个问题。

changed_data = dict(request.POST)
changed_data['price'] = NEW_PRICE
search_packages_form = SearchPackagesForm(data = changed_data)

正如@The EasyLearn Academy 评论的那样:它不允许您访问以表单形式提交的实际数据。

这是因为 request.POST 是不可变的。

但是这个问题有一个解决方案 - 只是需要更棘手。

此解决方案仅在对某个对象的引用足以满足特定原因时才有效。它使对象本身保持不变。

# write object to variable (data)
data = request.POST

# set to mutable
data._mutable = True

# modify the values in data 
data[modified_field] = new_value

# set mutable flag back (optional)
data._mutable = False

希望有用!

答案 3 :(得分:-1)

form.is_valid()贯穿您的表单(如果使用ModelFormclean方法,则会返回模型,返回TrueFalse

如果您打算更改表单数据,可以在常规清理方法或字段级别进行,例如

class YourForm(DerivingClass):
    # regular stuff

    def clean_<ATTR>(self):
        # here
        return self.cleaned_data

    def clean(self):
        # or here
        return super(YourForm, self).clean()