python - 类型错误:post() 缺少 1 个必需的位置参数
问题描述
我正在尝试从模板中的表中编辑数据:
我单击“编辑”按钮,但出现此错误:post() missing 1 required positional argument: 'folio'
这是我的urls.py
from django.contrib import admin
from django.contrib.staticfiles.storage import staticfiles_storage
from django.conf.urls import url
from django.urls import path, include, re_path
from . import views
from django.views.generic.base import RedirectView
app_name = 'oficios'
urlpatterns = [
path('', views.lista_oficios, name="list"),
path('crear/', views.crear_oficio, name="crear"),
path('dependencia/', views.agregar_dependencia, name="dependencia"),
path('editar/', views.EditarOficio.as_view(), name="editar"),
path('editar/<str:folio>/', views.EditarOficio.as_view(), name="editar"),
]
我的意见.py:
@method_decorator(login_required, name='dispatch')
class EditarOficio(CreateView):
model = Oficio
fields = ['folio', 'usuario', 'asunto',
'estatus', 'documento', 'dependencia', 'turnado']
def get(self, request, folio):
oficio = Oficio.objects.get(id=folio)
form = forms.CreateOficio(instance=oficio)
context = {
"form": form,
"title": "Editar oficio " + oficio.folio
}
return render(request, "editar_oficio.html", context)
def post(self, request, folio):
oficio = Oficio.objects.get(id=folio)
print(oficio)
form = forms.CreateOficio(request.POST, request.FILES, instance=oficio)
context = {
"form": form,
"title": "Editar oficio " + oficio.folio
}
if(form.is_valid()):
oficio = form.save(commit=False)
oficio.save()
return redirect('oficios:list')
return render(request, "editar_oficio.html", context)
我的模型.py:
class Oficio(models.Model):
class Estatus(models.TextChoices):
NUEVO = 'NU', _('Nuevo')
NO_REVISADO = 'NR', _('No Revisado')
LEIDO = 'L', _('Leido')
SEGUIMIENTO = 'S', _('Seguimiento')
COMPLETADO = 'C', _('Completado')
folio = models.CharField(
primary_key=True, max_length=10, unique=True, null=False)
usuario = models.ForeignKey(
settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
fecha = models.DateTimeField(auto_now_add=True)
asunto = models.TextField(null=False)
estatus = models.CharField(
max_length=2, choices=Estatus.choices, default=Estatus.NUEVO)
documento = models.FileField(upload_to='pdf')
dependencia = models.ForeignKey(
'Dependencia', on_delete=models.CASCADE, related_name='dependencia_origen')
turnado = models.ForeignKey(
'Dependencia', on_delete=models.CASCADE, related_name='dependencia_destino')
我的模板:
{% extends 'base.html' %}
{% block content %}
<h1>EDITAR OFICIO</h1>
<form class="" action="{% url 'oficios:editar' oficio.folio %}" method='POST' enctype="multipart/form-data">
{% csrf_token %}
{{ form }}
<button class="btn btn-primary btn-lg" type="submit">Editar</button>
</form>
{% endblock content %}
我尝试更改最后一个post
参数,slug=None
但我没有尝试更新的对象的“id”。我不知道我做错了什么,有人可以建议我吗?请
解决方案
首先,通过拥有两个同名的 URL,我认为您会在系统内就正在使用的 URL 以及将用户发送到的 URL 发生冲突。
Django 按顺序检查 URL,因此第一个匹配的是被命中的 URL。
urlpatterns = [
path('editar/', views.EditarOficio.as_view(), name="editar"),
path('editar/<str:folio>/', views.EditarOficio.as_view(), name="editar"),
]
在您的 classEditarOficio
中,get
和post
requests 都需要folio
存在一个参数,这意味着第一个不传递该参数的 URL 无效。
我将首先在这里使用两个不同的名称,以便您可以根据需要定位每个 URL。你已经建议这仍然不能解决问题,所以此时我也会将路径本身更改为除了 之外的东西editar
,如果只是为了调试这个问题。因为您已经说过在定义不同的名称后这个问题仍然存在,所以这听起来像是oficio.folio
没有价值或发生了一些意想不到的事情。
您应该通过尝试显示数据{{ oficio.folio }}
等来在模板中进行调试,以确认数据可用。
根据您的模板,您似乎没有在上下文中传递必要的数据以形成正确的 URL 来发布您的表单。
您的模板尝试oficio.folio
在形成 URL 时做,但oficio
在上下文中不可用。
尝试做一些与此类似的更改;
@method_decorator(login_required, name='dispatch')
class EditarOficio(CreateView):
model = Oficio
fields = ['folio', 'usuario', 'asunto',
'estatus', 'documento', 'dependencia', 'turnado']
def get(self, request, folio):
oficio = Oficio.objects.get(id=folio)
form = forms.CreateOficio(instance=oficio)
context = {
"form": form,
"oficio": oficio,
"title": "Editar oficio " + oficio.folio
}
return render(request, "editar_oficio.html", context)
def post(self, request, folio):
oficio = Oficio.objects.get(id=folio)
print(oficio)
form = forms.CreateOficio(request.POST, request.FILES, instance=oficio)
context = {
"form": form,
"oficio": oficio,
"title": "Editar oficio " + oficio.folio
}
if(form.is_valid()):
oficio = form.save(commit=False)
oficio.save()
return redirect('oficios:list')
return render(request, "editar_oficio.html", context)
或者,oficio
是表单的实例,因此您可以在保持视图不变的同时执行以下操作:
{% url 'oficios:editar' form.instance.folio %}
推荐阅读
- python - Google OR 工具 - 重新审视列车调度问题
- java - Swagger 生成器将类附加到包名的一部分
- jquery - jQuery resize() 用于显示和隐藏图像
- python - 只有数值的 DF 列
- c - 使用C中的中序横向将树数据结构存储到数组中
- python - 我如何在 concurrent.futures.ThreadPoolExecutor.map 函数中计时执行其他函数?
- jmeter - 如何在 JSR223 PreProcessor 中访问 CSV 配置数据集值
- reactjs - React hoc Generic error - 可以用不同的约束子类型“InjectedProps”实例化
- c# - 从 Oracle 数据库中检索插入的数据
- java - 如何使用spark java选择两个符号[]和''之间的数据框行