python - Django 表单,未提交表单

标签 python django forms django-forms

我是 django 的新手,我的表单有一些问题。它没有提交任何东西。我不知道为什么,终端中没有出现任何问题。它正确显示了表单,但是在填写并提交时,它只是将我重定向到相同的表单但空白。我检查了数据库,但没有添加任何内容。我的代码如下:

#views.py
def ContractView(request):
   form=contractsform(request.POST)
   if form.is_valid():
        con =form.save()
        return redirect("{% url 'contracts' %}", con.id)
   else:
        form = contractsform()
   return render(request, 'contform.html', {'form': form})

#contform.html
                  <div class="card-body">
                    <form action="" method="POST" class="row g-3">
                        {% csrf_token %}
                        <label for="{{ form.subject.id_for_label }}">Name:</label>
                        {{form.name}}
                        <div class="col-md-6">
                            <label for="{{ form.subject.id_for_label }}">Contractor:</label>
                            <div class="input-group input-group-sm mb-3">
                                {{form.contractor}}
                                <button id="new-vendor" class="btn btn-outline-secondary" type="button">+</button>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <label for="{{ form.subject.id_for_label }}">Contractee:</label>
                            {{form.contractee}}
                        </div>
...
                        <div class="col-md-6">
                            <button type="button" onclick="javascript:history.back()">Cancel</button>
                        </div>
                        <div class="col-md-6">
                            <input type="submit" value="Submit" class="btn btn-primary" style="float: right;">
                        </div>

                    </form>

#forms.py
class contractsform(forms.ModelForm):
    class Meta:
        model = Contratos
        fields = '__all__'

        widgets = {
            
            'name': forms.TextInput(attrs ={'class': 'form-control'}),
            'contractee': forms.TextInput(attrs={'class': 'form-control'}),
            'contractor': forms.Select(attrs={'class': 'form-control', 'id': 'contractor_view' }),}

#urls.py
urlpatterns = [
    path('contracts/', views.contratostabla, name='contracts'),
    path('contracts/add/', ContractView, name='new-contract'),
]

最佳答案

您当前正在将表单重新定义为无效的空表单,您需要更改逻辑以在请求方法为 POST 时使用填充 POST 数据的表单,而在请求方法为 GET 时使用空表单。当它无效时,您仍然需要使用已填写的表单进行 POST,以便您获得错误和以前的数据

def ContractView(request):
   if request.method == 'POST':
       form = contractsform(request.POST)
       if form.is_valid():
           con = form.save()
           return redirect("{% url 'contracts' %}", con.id)
   else:
        form = contractsform()
   return render(request, 'contform.html', {'form': form})

仅供引用,关于可读性,惯例是对类使用 CamelCase,这样您的表单将被命名为 ContractsForm,对函数使用带下划线的小写字母,因此您的 View 将是 contract_view

关于python - Django 表单,未提交表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72835117/

相关文章:

python - 关联 2 个列表

python - 如何在python中实现队列的深复制

python - Django 测试 DoesNotExist : Contact matching query does not exist

java - 错误请求中的重定向

python - Django URL反向: argument to reversed() must be a sequence

python - 在 supervisord 配置中引用现有环境变量时如何设置环境变量?

python - Django 分组依据变量

python - 如何将 JSON 数据转换为 python 实例并使用 foreginkey 保存 Django 模型多个表(数据库 sqllite)

php - 如何处理包含 500 多个项目的 Symfony 表单集合

html - 易趣搜索表单