我在其中一个模型中有三个整数字段,如下所示:
class SomeModel(models.Model):
min_age = models.IntegerField()
max_age = models.IntegerField()
savings = helpers.MoneyField()
MoneyField是一个自定义字段,它使用一个小部件,将一个数量(170000)分解为两个下拉列表,形式为100000(Lakhs)和(70000)数千个。
对于我使用上述货币字段的表单,我有一个form preview
视图,强制用户在发布前预览表单。
使用相同的想法,我想更改min_age
和max_age
以使用单个小部件。所以我,
添加了AgeFields(多值字段如下):
类AgeField(forms.MultiValueField):
def __init__(self, *args, **kwargs):
"""
Have to pass a list of field types to the constructor, else we
won't get any data to our compress method.
"""
all_fields = (
forms.CharField(),
forms.CharField(),
)
super(AgeField, self).__init__(all_fields, *args, **kwargs)
def compress(self, values):
if values:
print values
return '|'.join(values)
return ''
然后在表单中,我隐藏了模型字段并使用上面的字段来使用看起来类似于MoneyWidget()
的自定义窗口小部件
class PostForm(forms.ModelForm):
age = AgeField(widget=widgets.AgeWidget(),
required=False)
def is_valid(self):
return super(PostForm, self).is_valid()
def full_clean(self, *args, **kwargs):
print self.data
if 'age_0' in self.data:
newdata = self.data.copy()
newdata['min_age'] = self.data['age_0']
newdata['max_age'] = self.data['age_1']
print newdata
self.data = newdata
super(PostForm, self).full_clean(*args, **kwargs)
class Meta:
model = models.SomeModel
fields = (
'age', 'min_age', 'max_age',
'savings'
)
widgets = {
'min_age' : forms.HiddenInput(),
'max_age' : forms.HiddenInput(),
'savings' : widgets.MoneyWidget(),
}
目前正在运行的所有内容,虽然FormPreview
创建了一个循环。因为我使用上面的full_clean
方法将值插入到实际的模型字段中。
所以这就是发生的事情。
security_hash
并呈现预览视图。现在,如果表单没问题,并且用户单击了提交按钮,则formpreview而不是提交表单将循环回预览。然后在预览模板上再次单击提交按钮,表单将被提交。
这很可能是因为我们在生成security_hash之后在full_clean方法中设置了min_age
和max_age
的值。当我们操作数据时,上面的方法会更改security_hash。
第二次,用户提交表单。 min_age
和max_age
字段已有相同的数据,因此security_hash
保持不变。
我们是否可以操作security_hash,或者可以在生成security_hash之前将值插入min_age和max_age。所以它保持不变?
实现上述目标的最佳方法是什么?
欢迎任何建议。感谢。
我试图深入挖掘,因为我假设安全哈希失败了。因此,为了确保我在调用failed_hash()
的{{1}}视图之前超越preview_post()
方法以打印错误消息,并猜测这是被调用的方法和重定向表单返回FormPreview
方法。
我认为安全哈希无法匹配,因为我正在操纵上述preview_post()
方法中的POST
数据,所以我设置了min_age和max_age full_clean()
,然后尝试显式设置required=False
方法中的值如下
save()
但仍然没有运气。 def save(self, *args, **kwargs):
if 'age_0' in self.data:
newdata = self.data.copy()
newdata['min_age'] = self.data['age_0']
newdata['max_age'] = self.data['age_1']
self.data = newdata
super(PostForm, self).save(*args, **kwargs)
def __init__(self, *args, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields['min_age'].required = False
self.fields['max_age'].required = False
方法仍在调用,循环仍然存在。 :(