ManagementForm 数据丢失或被篡改

Posted

技术标签:

【中文标题】ManagementForm 数据丢失或被篡改【英文标题】:ManagementForm data is missing or has been tampered with 【发布时间】:2014-10-09 11:44:18 【问题描述】:

我正在尝试创建一个表单集来保存记录。但是,当我提交表单时,我不断收到错误消息。如果可能的话,请告诉我应该如何保存我的批次记录。

我的意见.py:

def weekly_progress(request):
    ProgressFormSet = formset_factory(WeeklyProgressReportForm, extra=16)
    formset = ProgressFormSet(request.POST or None)

    if formset.is_valid():
        for f in formset:
           print(f)

    return render(request, "progress/progressentry.html", 'formset' : formset)

我的表单.py

class WeeklyProgressReportForm(forms.ModelForm):
    class Meta:
       model = WeeklyProgressReport
       fields = ('target_date', 'this_date', 'pkgno', 'slno', 'description', 'unit', 'receipt_this_week', 'issue_this_week', 'erection_this_week')
       widgets = 
        'target_date': forms.DateInput(attrs='class': 'form-control', 'readonly': 'readonly'),
        'this_date': forms.DateInput(attrs='class': 'form-control', 'readonly': 'readonly'),
        'pkgno': forms.TextInput(attrs='class': 'form-control', 'readonly': 'readonly'),
        'slno': forms.NumberInput(attrs='class': 'form-control', 'readonly': 'readonly'),
        'description': forms.Textarea(attrs='class': 'form-control', 'rows': 1, 'readonly': 'readonly'),
        'unit': forms.TextInput(attrs='class': 'form-control', 'readonly': 'readonly'),
        'receipt_this_week': forms.NumberInput(attrs='class': 'form-control', 'step': 0.01),
        'issue_this_week': forms.NumberInput(attrs='class': 'form-control', 'step': 0.01),
        'erection_this_week': forms.NumberInput(attrs='class': 'form-control', 'step': 0.01, 'readonly': 'readonly'),
       

我的模板:

<form id="contractor-form" method="post" action="">
    % csrf_token %

    <!-- First Row -->
    <div class="col-lg-6">
        <div class="panel panel-primary">
            <div class="panel-heading">Select Your Package</div>
            <div class="panel-body">
                <div class="col-lg-4">                        
                    <h4><label class="label label-primary">Package Number</label></h4>
                </div>
                <div class="col-lg-4">
                    <select id="pkgno-select" class="form-control">                                
                        <option value="12 (BRP)">12 (BRP)</option>
                        <option value="13 (BRP)">13 (BRP)</option>
                        <option value="13 (DHB)">13 (DHB)</option>
                        <option value="14 (DHB)">14 (DHB)</option>
                    </select>
                </div>
                <div class="col-lg-4">                        
                        <button type="button" id="date-edit" class="btn btn-warning">Edit Date</button>                        
                </div>
            </div>
        </div>
    </div>


    <!-- Second Row -->
    <div class="col-lg-12">
        <div class="panel panel-primary">
            <div class="panel-heading">Quantities</div>
            <div class="panel-body">
                <table class="table table-hover">
                    <thead>
                        <tr>
                            <th>Target Date</th>
                            <th>This Date</th>
                            <th>Pkg Number</th>
                            <th>Sl Number</th>
                            <th>Description</th>
                            <th>Unit</th>
                            <th>Receipt This Week</th>
                            <th>Issue This Week</th>
                            <th>Erection This Week</th>                                
                        </tr>
                    </thead>
                    <tbody>
                        % for form in formset %
                        <tr>
                           <td> form.target_date </td>
                           <td> form.this_date </td>
                           <td> form.pkgno </td>
                           <td> form.slno </td>
                           <td> form.description </td>
                           <td> form.unit </td>
                           <td> form.receipt_this_week </td>
                           <td> form.issue_this_week </td>
                           <td> form.erection_this_week </td>                               
                        </tr>
                        % endfor %
                    </tbody>
                </table>
            </div>
        </div>
    </div>

    <!-- Submit Button -->
    <div class="well well-lg">
        <button type="submit" class="btn btn-success btn-lg btn-block">Save</button>
    </div>
</form>

我的模型.py

class WeeklyProgressReport(models.Model):
   target_date = models.DateField()
   this_date = models.DateField()
   pkgno = models.CharField(max_length=10)
   slno = models.IntegerField(max_length=2)
   description = models.CharField(max_length=50)
   unit = models.CharField(max_length=5)
   target_quantity = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)
   receipt_previous = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)
   receipt_this_week = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)
   issue_previous = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)
   issue_this_week = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)
   erection_previous = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)
   erection_this_week = models.DecimalField(max_digits=12, decimal_places=2, blank=True, default=0)    

   def __unicode__(self):
       return self.pkgno

【问题讨论】:

【参考方案1】:

您必须在模板中呈现管理表单。 docs 解释原因和方式;一些选定的报价:

表单集使用此表单来管理表单集中包含的表单集合。如果您不提供此管理数据,则会引发异常[.]

管理表单可作为表单集本身的属性使用。在模板中渲染表单集时,您可以通过渲染 my_formset.management_form (根据需要替换表单集的名称)来包含所有管理数据。

【讨论】:

thequickblog.com/…【参考方案2】:

在你的% for form in formset %上方写上 formset.management_form

喜欢这个

 formset.management_form 
% for form in formset %

【讨论】:

【参考方案3】:

我在尝试在同一页面上使用两个表单集时遇到了同样的问题,我正在添加它的解决方案,因为我在其他任何地方都没有找到它。

确保将prefix 参数添加为

formset = ProgressFormSet(request.POST or None, prefix="fs1")

同时发送 GET 和 POST 请求。

【讨论】:

以上是关于ManagementForm 数据丢失或被篡改的主要内容,如果未能解决你的问题,请参考以下文章

Django Crispy 表单 - 更新视图的内联表单集“ManagementForm 数据”错误

session放数据库里解决丢失的问题

Django Formset管理-表单验证错误

有没有办法防止查询字符串被篡改或查询字符串丢失?

EVA4400存储RAID信息丢失数据恢复过程

看看这款文件防篡改监控工具——WGCLOUD