我对以下视图和形式有问题。但是,当我编辑任何未保存的字段时,表单将正确加载。经过一段时间的调试,我认为这是由于以下两个原因之一:request.method == "POST"
的计算结果为false,或者{
视图.py
@login_required
def edit_transaction(request, pk):
transaction = get_object_or_404(Transaction, pk=pk)
if request.method == "POST":
form = TransactionForm(request.POST, instance=transaction)
if form.is_valid():
transaction = form.save(commit=False)
transaction.updated = timezone.now()
transaction.save()
return redirect('view_transaction_detail', pk=transaction.pk)
else:
form = TransactionForm(request=request, instance=transaction)
return render(request, 'budget/new_transaction.html', {'form': form})
表单.py
^{2}$模板
{% extends 'budget/base.html' %}
{% block content %}
<h2>New transaction</h2>
<h4>To add a new category, leave Category blank and enter your new category in the New Category Title field</h4>
<form method="POST" class="post-form">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
{% endblock %}
更新以下答案-通过kwargs访问请求
def __init__(self, *args, **kwargs):
super(TransactionForm, self).__init__(*args, **kwargs)
self.fields['category'].required=False
self.request = kwargs.pop('request', None)
正如我在上一个问题中提到的,由于您更改了表单的init方法的签名,因此需要在实例化请求时同时传递请求。只有当它不是POST时才这样做;因此,当它是POST时,Python接受您传递的数据并将其分配给
request
参数,而数据本身为空。在注意,正是由于这个原因,更改签名不是一个好主意;相反,将
request
作为关键字参数传递,然后在方法内部从kwargs
获取它。在相关问题 更多 >
编程相关推荐