【问题标题】:TypeError: post() missing 1 required positional argument [closed]TypeError:post()缺少1个必需的位置参数[关闭]
【发布时间】:2021-09-12 02:48:30
【问题描述】:

我正在尝试编辑模板中表格中的数据:

我点击“编辑”按钮,但出现此错误: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"),
]

我的views.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)

我的models.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 %}

我尝试用slug=None 更改最后一个post 参数,但是我没有要更新的对象的“id”。我不知道我做错了什么,有人可以建议我吗?请

【问题讨论】:

  • 页面渲染时表单的action参数中的URL是什么?
  • 对不起,我不明白你的问题。 action 函数在哪里?
  • 当你查看页面源代码时,这个部分是什么样子的; action="{% url 'oficios:editar' oficio.folio %}"
  • 它将我重定向到http://localhost:8000/oficios/editar/,但显示一个Django错误页面,如上图post() missing 1 required positional argument: 'folio'我读到oficios.folio需要在那里,所以模板通过“id”到views.py 文件:(

标签: python django django-rest-framework django-views django-templates


【解决方案1】:

首先,通过拥有两个同名的 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"),
]

在您的课程EditarOficio 中,getpost 请求都需要存在folio 参数,这意味着第一个没有传递该参数的URL 无效。

我会先在这里使用两个不同的名称,以便您可以根据需要定位每个 URL。您建议这仍然不能解决问题,所以此时我还将路径本身更改为editar 之外的其他内容,如果只是为了调试此问题。因为您说过在定义不同的名称后这个问题仍然存在,所以听起来oficio.folio 没有值或发生了意外情况。

您应该在模板中进行调试,尝试显示{{ oficio.folio }} 等数据以确认数据可用。

根据您的模板,您似乎没有在上下文中传递必要的数据以形成正确的 URL 来发布您的表单。

您的模板尝试在 URL 的形成中执行 oficio.folio,但 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 %}

【讨论】:

  • 感谢您的回答,但我仍然收到TypeError at /oficios/editar/ post() missing 1 required positional argument: 'folio' 并提供了两种解决方案。我不知道为什么如果我从oficio = Oficio.objects.get(id=folio) 得到folio,我什至打印这个变量并得到我想要的,我正在尝试更新的那个模型的pk
  • @Danny 我认为这个问题可能与您有 2 个具有相同名称的 URL 的事实有关。我建议为这 2 个 URL 设置 2 个名称。
  • @Danny 我已经添加了一些关于 URL 的进一步解释,但听起来这需要调试以找出实际发生的情况。
  • 嘿 @markwalker_ 我决定用方法而不是类来制作 mi 视图,在那个过程中,我意识到在“编辑”按钮中的 action 参数中,我也进入了另一个 url没有传递该模板中对象的密钥(第一张图片)。所以问题解决了,感谢您抽出宝贵时间查看我的问题,非常感谢。
  • @Danny 我从您的表单和您的视图中关注post,但刚刚看到folio 也是get 请求的必需参数,这意味着您的第一个URL没有包含该参数永远不会起作用,因为它没有获取或发布请求的参数。
猜你喜欢
  • 2021-05-16
  • 2022-01-18
  • 2020-09-03
  • 2022-01-27
  • 2021-12-30
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多