【问题标题】:Form has been tampered with - django form validation表单被篡改 - django 表单验证
【发布时间】:2017-09-29 06:09:18
【问题描述】:

我现在正在使用一个模型表单的表单集,该表单集包含在 html 模板中的其他表单。我将表单提交到 views.py 文件中以处理表单。据说表格已被篡改,我不知道为什么会这样说。我将在下面包含所有相关代码:

错误:

ValidationError at /17/hello/update_expense_individual/
['ManagementForm data is missing or has been tampered with']

这是表单模板:

{% extends "base.html" %}

{% block content %}
  <h2>Add expense - {{ currentGroup.name }}</h2>
  {% if message %}
    <p>{{message}}</p>
  {% endif %}
  <form action="." method="POST">
    {% csrf_token %}
    {% for f in form %}
       {% for expense in expenses %}
           {% if forloop.parentloop.counter == forloop.counter %}
              <p>{{ expense.user.username }}</p>
           {% endif %}
       {% endfor %}
       {{ f.as_p }}
    {% endfor %}
    <p>
      Tax:
      <input type="number" name="tax" value="0.00">
    </p>
    <p>
      Tip:
      <input type="number" name="tip" value="0.00">
    </p>
    <input type="submit" name="submit" value="submit">
  </form>
{% endblock %}

这里是处理表单的views.py:

错误引用了 if form.is_valid()

def updateExpenseIndividual(request, groupId, groupName):
    currentUser = loggedInUser(request)
    currentProfile = Profile.objects.get(user = currentUser)
    currentGroup = Group.objects.get(id = groupId)
    host = Member.objects.filter(group = groupId).filter(status = 2).first()
    expenses = Expense.objects.filter(group = currentGroup).filter(name = groupName).all()
    expenses_count = Expense.objects.filter(group = currentGroup).filter(name = groupName).count()
    SplitFormSet = formset_factory(UpdateExpenseForm, extra=expenses_count)
    # form_user = zip(expenses, SplitFormSet)
    if request.method == 'POST':
        formSet = SplitFormSet(request.POST)
        if 'tax' in request.POST:
            tax = request.POST['tax']
            amount = Decimal(tax)
            individual_tax = SplitEven(expenses_count, amount)
        if 'tip' in request.POST:
            tip = request.POST['tip']
            amount = Decimal(tip)
            individual_tip = SplitEven(expenses_count, amount)
        if formSet.is_valid():
            count = 0
            for form in formSet:
                cd = form.cleaned_data
                amount = cd['amount']
                description = cd['description']
                total_amount = amount + individual_tip + individual_tax
                expense = expenses[count]
                update_expense = expense
                update_expense.amount = total_amount
                update_expense.description = description
                update_expense.save()
                if expense.user != host.user:
                    user_description = 'You owe ' + host.user.username + ' ' + str(total_amount) + ' for ' + description
                    host_description = expense.user.username + ' owes you ' + str(total_amount) + ' for ' + description
                    user_activity = Activity.objects.create(
                        user = expense.user,
                        group = currentGroup,
                        description = user_description,
                        status = 1,
                        category = 4,
                    )
                    host_activity = Activity.objects.create(
                        user = host.user,
                        group = currentGroup,
                        description = host_description,
                        status = 1,
                        category = 4,
                    )
            return redirect('group_home', groupId = currentGroup.id)
    else:
        form = SplitFormSet()
        message = 'Please complete the form below'
        parameters = {
            'message':message,
            'form':form,
            'currentGroup':currentGroup,
            'expenses':expenses,
            # 'form_user':form_user,
        }
        return render(request, 'tabs/update_expense_individual.html', parameters)

这是我从请求中得到的响应:

csrfmiddlewaretoken 
'zn1wHtaRIITsQlEhMiDJzqVhYrTbws9Q1qbYhfd66JybPnIt0joqS2WlXQqQwqgZ'
form-0-amount   
'11.00'
form-0-description  
'lunch'
form-1-amount   
'22.00'
form-1-description  
'salad'
form-2-amount   
'33.00'
form-2-description  
'later'
tax 
'3.00'
tip 
'6.00'
submit  
'submit'

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    模板中需要有管理表格

    {{ form.management_form }}

    【讨论】:

    • 在模板文件中的哪里添加
    • 里面的
    • 那行得通吗?如果有效,请接受答案:)
    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 2017-03-15
    • 1970-01-01
    • 2014-12-01
    • 2011-03-10
    • 2011-01-19
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多