为什么我的Django表单在我不打电话的时候验证是有效的

2024-03-29 04:55:47 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:我已经确定原因是rhel7提供的python包。解决方案是安装一个备用版本。在我的例子中,我刚刚将服务器移动到centOS,在那里提供的python与django一起工作。你知道吗

我有一个窗体可以对我的主视图进行操作,它包含两个按钮,保存和取消。在本地dev服务器上运行时(管理.py(runserver)这工作正常。当我把它推到生产环境中时,cancel按钮返回表单验证错误,尽管没有调用is\u valid方法。你知道吗

以下是视图:

def home(request):
#uses home.html
if request.method == 'POST':
    #Figure out which button was pressed
    #Cancel Button - Back to home
    if request.POST.get("cancel"):
        #return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
        footer = request
        lineitems = Budget.build(request.user)
        c = {'lineitems': lineitems,
             'footer':footer,}
        return render(request, 'home.html', c)
    #Save button on config.html IncomeForm/Expenses Form
    if request.POST.get("config_save"):
        #ExpensesForm submitted
        if 'expenseName' in request.POST:
            form = ExpensesForm(request.POST)
            if form.is_valid():
                form.save()
            else:
                temp = 'config.html'     
                footer = 'Expense Form Invalid'
                c = {'form':form,
                     'footer':footer,}
                return render(request, temp, c)
        #IncomeForm submitted
        else:
            form = IncomeForm(request.POST)
            if form.is_valid():
                form.save()
            else:
                form = IncomeForm(request.POST)
                temp = 'config.html'     
                footer = 'Form Invalid'
                c = {'form':form,
                     'footer':footer,}
                return render(request, temp, c)
        #Use Budget Class to populate a table in template
        Budget.update_data({'months':12,
                            'user':request.user})
        temp = 'home.html'
        footer = '* Line Modified'
        lineitems = Budget.build(request.user)
        c = {'lineitems': lineitems,
             'footer':footer,}
        return render(request, temp, c)
# if a GET (or any other method) we'll load the budget
else:
    footer = '* Line item modified'
    footer = request
    Budget.update_data({'user': request.user,
                        'months':12})
    lineitems = Budget.build(request.user)
    c = {'lineitems': lineitems,
         'footer':footer,}
    return render(request, 'home.html', c)

模板如下:

{% extends "base.html" %}
{% load bootstrap3 %}

{% block title %}
<h1>Add {{ itemtype }}</h1>
{% endblock %}

{% block content %}
<form action="{% url 'home' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<div class="btn-group">
<input type="submit" name="config_save" value="Save" class="btn btn-primary"/>
<input type="submit" name="cancel" value="Cancel" class="btn btn-default"/>
</div>
</form>
{% endblock %}
{% block footer %}
{{ footer }}
{% endblock %}

编辑*

当我替换

{{ form.as_p }}

{% bootstrap_form form layout='vertical' %}

但不幸的是,在apache/wsgi服务器上运行时,这两种方法都不起作用。你知道吗

这是我的表格。注意,我还尝试删除类别:窗体控件和没什么区别。我还有另一个表单和视图,它的行为与此几乎相同(cancel是用else处理的,表单是modelform),唯一的区别是没有日期字段。为了排除这个问题,我排除了日期字段,但仍然有相同的问题。你知道吗

#Edit form to add/edit Expenses and Bills
class ExpensesForm(forms.ModelForm):
    class Meta:
        model = Items
        exclude = ('skiplst',)
        widgets = {'user': forms.HiddenInput(),
                   'itemType': forms.HiddenInput(),
                   'itemName': forms.TextInput(attrs={'class':'form-control',}),
                   'category': forms.Select(attrs={'class':'form-control',}),
                   'itemAmount': forms.NumberInput(attrs={'class':'form-control',}),
                   'payCycle': forms.Select(attrs={'class':'form-control',}),
                   'itemNote': forms.TextInput(attrs={'class':'form-control',}),
                   'nextDueDate': forms.DateInput(attrs={'name': 'date',
                                                         'class':'form-control'}),
                   'endDate': forms.DateInput(attrs={'name': 'date',
                                                     'class':'form-control'})}

#Edit form to add/edit Income Sources
class IncomeForm(forms.ModelForm):
    class Meta:
        model = Items
        exclude = ('category','skiplst')
        widgets = {'user': forms.HiddenInput(),
                   'itemType': forms.HiddenInput(),
                   'itemName': forms.TextInput(attrs={'class':'form-control',}),
                   'itemAmount': forms.NumberInput(attrs={'class':'form-control',}),
                   'payCycle': forms.Select(attrs={'class':'form-control',}),
                   'itemNote': forms.TextInput(attrs={'class':'form-control',}),
                   'nextDueDate': forms.DateInput(attrs={'name': 'date',
                                                         'class':'form-control'}),
                   'endDate': forms.DateInput(attrs={'name': 'date',
                                                     'class':'form-control'})}

Tags: formhomereturnifrequesthtmlformspost