表单预览安全哈希操作

时间:2012-12-27 12:48:33

标签: django forms security hash preview

我在其中一个模型中有三个整数字段,如下所示:

class SomeModel(models.Model):
    min_age = models.IntegerField()
    max_age = models.IntegerField()
    savings = helpers.MoneyField()

MoneyField是一个自定义字段,它使用一个小部件,将一个数量(170000)分解为两个下拉列表,形式为100000(Lakhs)和(70000)数千个。

对于我使用上述货币字段的表单,我有一个form preview视图,强制用户在发布前预览表单。

使用相同的想法,我想更改min_agemax_age以使用单个小部件。所以我,

  1. 添加了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 ''
    
  2. 然后在表单中,我隐藏了模型字段并使用上面的字段来使用看起来类似于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方法将值插入到实际的模型字段中。

    所以这就是发生的事情。

    1. 用户填写表单并单击“预览”。
    2. 这会为该特定表单创建security_hash并呈现预览视图。
    3. 如果表单没问题,用户再次提交表单,否则他点击编辑按钮再次编辑表单。
    4. 现在,如果表单没问题,并且用户单击了提交按钮,则formpreview而不是提交表单将循环回预览。然后在预览模板上再次单击提交按钮,表单将被提交。

      这很可能是因为我们在生成security_hash之后在full_clean方法中设置了min_agemax_age的值。当我们操作数据时,上面的方法会更改security_hash。

      第二次,用户提交表单。 min_agemax_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 方法仍在调用,循环仍然存在。 :(

0 个答案:

没有答案