alex
alex

Reputation: 2541

Django missing 1 required positional argument

I am trying to make a view that i can use in multiple apps with different redirect urls:

Parent function:

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)

Child function:

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

When i'm trying to call admin_order_document function i'm getting:

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'

If i remove redirect_url from both functions and manually add 'administrator:order_waiting_list' to redirect() it works, but i need to redirect to multiple urls. So, why am i getting this error?

Upvotes: 2

Views: 8543

Answers (2)

Alasdair
Alasdair

Reputation: 309089

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

This clearly is not going to work, since create_order requires redirect_url but there is no redirect_url kwarg in the regex r'^orders/create/'.

Perhaps you want to use the admin_order_document view here instead:

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

Note you should add a trailing dollar, i.e. r'^orders/create/$' unless you want to match orders/create/something-else as well as orders/create/.

Upvotes: 3

Philipp Zettl
Philipp Zettl

Reputation: 196

If you didn't changed the regular url

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

of your admin site you need to call your function like that:

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

That should fix your problem.

Upvotes: 0

Related Questions