Django表单发布方法

2024-03-29 01:57:54 发布

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

我对以下视图和形式有问题。但是,当我编辑任何未保存的字段时,表单将正确加载。经过一段时间的调试,我认为这是由于以下两个原因之一:request.method == "POST"的计算结果为false,或者{}的计算结果为false。所以我的模板或clean()方法可能有问题吗?我搜索了前面的问题,没有找到任何有用的东西。我还针对Django文档检查了clean()方法,认为它是可以的。在

视图.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)

Tags: selfform视图表单newrequestsavepost
1条回答
网友
1楼 · 发布于 2024-03-29 01:57:54

正如我在上一个问题中提到的,由于您更改了表单的init方法的签名,因此需要在实例化请求时同时传递请求。只有当它不是POST时才这样做;因此,当它是POST时,Python接受您传递的数据并将其分配给request参数,而数据本身为空。在

form = TransactionForm(request, data=request.POST, instance=transaction)

注意,正是由于这个原因,更改签名不是一个好主意;相反,将request作为关键字参数传递,然后在方法内部从kwargs获取它。在

相关问题 更多 >