我有一个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
但它不起作用。有什么想法吗?
答案 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()
贯穿您的表单(如果使用ModelForm
)clean
方法,则会返回模型,返回True
或False
如果您打算更改表单数据,可以在常规清理方法或字段级别进行,例如
class YourForm(DerivingClass):
# regular stuff
def clean_<ATTR>(self):
# here
return self.cleaned_data
def clean(self):
# or here
return super(YourForm, self).clean()