【问题标题】:Django missing 1 required positional argumentDjango 缺少 1 个必需的位置参数
【发布时间】:2018-06-20 18:03:48
【问题描述】:

我正在尝试创建一个可以在具有不同重定向 url 的多个应用程序中使用的视图:

父函数:

def create_order(request, redirect_url):
    data = dict()
    if request.method == 'POST':
        form = OrderForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect(redirect_url)
    else:
        form = OrderForm()
    data['form'] = form
    return render(request, 'core/order_document.html', data)

子函数:

@login_required()
def admin_order_document(request):
    redirect_url = 'administrator:order_waiting_list'
    return create_order(request, redirect_url)

当我尝试调用 admin_order_document 函数时,我得到:

Traceback (most recent call last):
  File "/home/project/venv/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/home/project/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/project/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
TypeError: create_order() missing 1 required positional argument: 'redirect_url'

如果我从两个函数中删除redirect_url 并手动将'administrator:order_waiting_list' 添加到redirect() 它可以工作,但我需要重定向到多个url。那么,为什么会出现这个错误?

【问题讨论】:

  • 你用的是什么 Django 版本?
  • Django 版本 1.11.7
  • 哪个 URL 给出了该错误消息,该 URL 的 URL 模式是什么?
  • url(r'^orders/create/', views.create_order, name='create_order'),create_order 函数位于核心中,我在管理员视图中导入它

标签: python django python-3.x


【解决方案1】:

如果您没有更改常规网址

urlpatterns = [
    url(r'^admin/', admin_site.urls),
    ...
]

您的管理站点需要这样调用您的函数:

@login_required()
def admin_order_document(request):
    redirect_url = 'admin:order_waiting_list'
    return create_order(request, redirect_url)

这应该可以解决您的问题。

【讨论】:

  • 我没有更改常规的管理员 url,有一个不同的应用程序管理员。在主 url 中: url(r'^administrator/', include('administrator.urls', namespace='administrator')),
  • 我的错,是order_waiting_list 在你的administrator.urls 中命名为name='order_waiting_list'
  • 在管理员的 url 中它被命名为 'order_waiting_list' 所以要访问它我必须写管理员:order_waiting_list,但我不认为 url 是问题,该函数只是不接受第二个参数.
  • 您是否尝试将create_order() 函数传递给reverse 对象?类似:from django.urls import reverseredirect_url = reverse('administrator:order_waiting_list')
【解决方案2】:
url(r'^orders/create/', views.create_order, name='create_order')

这显然行不通,因为create_order 需要redirect_url,但正则表达式r'^orders/create/' 中没有redirect_url kwarg。

也许您想在此处使用admin_order_document 视图:

url(r'^orders/create/', views.admin_order_document, name='create_order')

请注意,您应该添加尾随美元,即r'^orders/create/$',除非您想匹配orders/create/something-elseorders/create/

【讨论】:

  • 天哪,我不小心把 create_order 放在了 url 而不是 admin_order_document 中,这就是我想做的,但我没有注意
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 2018-01-24
  • 2019-05-27
  • 2015-07-08
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多