form.is_valid() 总是返回 false

1 投票
1 回答
1884 浏览
提问于 2025-04-16 13:24

Form.is_valid() 总是返回 false,并且从来没有显示任何错误信息。下面是来自 forms.py、views.py 和 template/transaction_add_page.html 的代码片段。

表单

class TransactionForm(forms.Form):
  account = forms.ModelChoiceField(queryset=Account.objects.none())
  transactions = forms.CharField(widget=forms.Textarea(attrs={'rows':'10', 'cols':'70'}))

  def __init__(self, user, *args, **kwargs):
    super(TransactionForm, self).__init__(*args, **kwargs)
    self.fields['account'].queryset = Account.objects.filter(user=user)

  def clean_account(self):
    if 'account' in self.cleaned_data:
      account = self.cleaned_data['account']
      return account
    raise forms.ValidationError('Please select an account.')

  def clean_transactions(self):
    if 'transactions' in self.cleaned_data:
      transactions = self.cleaned_data['transactions']
      return transactions
    raise forms.ValidationError('At-least one transaction is required.')

视图

@login_required
def transaction_add_page(request):
  if request.method == 'POST':
    form = TransactionForm(request.POST)
    if form.is_valid():
      variables = RequestContext(request, {'account': form.clean_account(), 'transactions': form.clean_transactions()})
      return render_to_response('transaction_confirm_page.html', variables)

  form = TransactionForm(request.user)
  variables = RequestContext(request, {'form': form})
  return render_to_response('transaction_add_page.html', variables)

模板

{% extends "base.html" %}
{% block title %}Add Transactions{% endblock %}
{% block head %}Add Transactions{% endblock %}
{% block content %}
<form method="post" action="." >
  {{ form.non_field_errors }}
  {{ form.errors }}

  {% for field in form %}
    <div>
      {{ field.errors }}
      {{ field.label_tag }}: {{ field }}
    </div>
  {% endfor %}

  <input type="submit" value="Add Transactions" />
</form>
{% endblock %}

1 个回答

2

如果你在初始化的时候设置了用户参数,那你就得用上它。

if request.method == 'POST':
   form = TransactionForm(user=request.user, data=request.POST)

撰写回答