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
相关产品推荐
相关产品推荐

