You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django表单开发报错:ferrocarrilFormulario()缺少request参数求助

解决Django表单错误:ferrocarrilFormulario() missing 1 required positional argument: 'request'

问题核心原因

你的代码存在命名冲突:视图函数ferrocarrilFormulario和表单类ferrocarrilFormulario同名,导致在视图里实例化表单时,实际调用的是视图函数本身而非表单类,从而抛出缺少request参数的错误。此外还有其他语法/逻辑问题,一并修复如下:

修复后的代码

1. Forms.py(重命名表单类,遵循PEP8规范)

from django import forms

# 改用大驼峰命名,避免和视图函数冲突
class FerrocarrilForm(forms.Form):
    tipo = forms.CharField()
    precio = forms.IntegerField()

2. views.py(修正命名冲突、处理GET请求、修复模型实例化)

from django.shortcuts import render
from .forms import FerrocarrilForm
# 导入你的模型,假设模型类名为Ferrocarril
from .models import Ferrocarril

# 重命名视图函数,避免和表单类冲突
def agregar_ferrocarril(request):
    # 处理GET请求:返回空表单
    if request.method == "GET":
        miFormulario = FerrocarrilForm()
        return render(request, "AppCoder/ferrocarril_form.html", {"miFormulario": miFormulario})
    
    # 处理POST请求:验证并保存数据
    if request.method == "POST":
        miFormulario = FerrocarrilForm(request.POST)
        print(miFormulario)
        
        # 注意is_valid是方法,要加括号()
        if miFormulario.is_valid():
            informacion = miFormulario.cleaned_data
            # 使用cleaned_data获取验证后的数据,而非直接取POST
            ferrocarril = Ferrocarril(tipo=informacion["tipo"], precio=informacion["precio"])
            ferrocarril.save()
            return render(request, "AppCoder/inicio.html")
    
    # 表单验证失败时,返回带错误的表单
    return render(request, "AppCoder/ferrocarril_form.html", {"miFormulario": miFormulario})

3. 表单HTML模板(修正语法错误)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Agrega un ferrocarril</title>
</head>
<body>
    {% if miFormulario.errors %}
        <p style="color: red;">Datos mal ingresados</p>
    {% endif %}

    <form action="" method="POST">
        {% csrf_token %}
        <table>
            <!-- 修正拼写错误:as_tabble → as_table -->
            {{ miFormulario.as_table }}
        </table>
        <input type="submit" value="Enviar">
    </form>
</body>
</html>

4. urls.py(更新视图函数路径)

from django.urls import path
from AppCoder import views

urlpatterns = [
    path('', views.inicio, name="Inicio"),
    path("ferrocarril/", views.ferrocarril, name="ferrocarril"),
    path("vias/", views.vias, name="vias"),
    path("manodeobra/", views.manodeobra, name="manodeobra"),
    path("tables.html/", views.tables, name="tables"),
    # 更新为修复后的视图函数名
    path("ferrocarrilFormulario/", views.agregar_ferrocarril, name="ferrocarrilFormulario")
]

关键注意点

  • 命名规范:Django中视图函数用小写下划线命名,表单类用大驼峰命名,避免冲突。
  • 表单验证:is_valid()是方法,必须加括号调用。
  • GET请求处理:视图需要返回空表单给GET请求,否则首次访问会报错。
  • 模板语法:模板标签里的变量不能加.({% if.miFormulario.errors %} → {% if miFormulario.errors %}),表单渲染方法拼写要正确。

内容的提问来源于stack exchange,提问作者Marcos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:40:52