f71316
f71316

Reputation: 252

__init__() got an unexpected keyword argument 'pk'

Trying to follow this tutorial with very minor modifications to apply the form and template to my object's model, but but running into an error I can't get around. This should be simple, the model creates the form, the form saves and redirects to the detail page.

As far as I can tell the call to HttpResponseRedirect is what is causing the error, but I have no idea why or what the problem is. The code appears to match (as close as possible) to what I'm seeing in the tutorial, as well as what I've seen on the django forms docs pages and other tutorials. Maybe this is something stupid I'm just not seeing it, but I've tried everything I can for a few hours now and I need another set of eyes on this. Please help. What did I screw up here? Thanks in advance.

The error I'm getting is:

__init__() got an unexpected keyword argument 'pk'

Here's my urls.py:

app_name = 'jobs'
urlpatterns = [
    # /jobs/
    url(r'^$', views.IndexView.as_view(), name='list'),
    url(r'^(?P<pk>[0-9]+)/$', views.detail, name='detail'),
    url(r'^edit/(?P<pk>[0-9]+)/$', views.edit, name='edit'),
    url(r'^edit/$', views.new, name='new'),
]

relevant views.py view:

def new(request):
    if request.method == "POST":
        form = JobForm(request.POST)
        if form.is_valid():
            job = form.save(commit=False)
            user = request.user
            member = Member.objects.get(user=user)
            buyer = Buyer.objects.get(member=member)
            job.buyer = buyer
            job.buyer_paid = False
            job.freelancers_paid = False
            #job.created = timezone.now()
            job.save()
            return HttpResponseRedirect('detail', pk=job.pk)
    else:
        form = JobForm()
    return render(request, 'jobs/edit.html', {'form': form})

forms.py file:

class JobForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(JobForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Job
        fields = (
            'handle',
            'name',
            'venue',
            'room',
            'start_on',
            'end_on',
            'contact',
            'description',
            'instructions',
            'dress_code',
        )

Traceback:

Environment:

Request Method: POST
Request URL: http://192.168.0.106:8000/jobs/edit/

Django Version: 1.8.7
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.admindocs',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.messages',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.staticfiles',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'rest_framework',
 'reversion',
 'commons',
 'members',
 'buyers',
 'freelancers',
 'payments',
 'geographic',
 'locations',
 'jobs',
 'technicians',
 'shifts')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Traceback:
File "/home/matt/.virtualenvs/hmd/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/matt/Projects/hmd/hiremedirect/jobs/views.py" in new
  35.             return HttpResponseRedirect('detail', pk=job.pk)
File "/home/matt/.virtualenvs/hmd/local/lib/python2.7/site-packages/django/http/response.py" in __init__
  457.         super(HttpResponseRedirectBase, self).__init__(*args, **kwargs)
File "/home/matt/.virtualenvs/hmd/local/lib/python2.7/site-packages/django/http/response.py" in __init__
  340.         super(HttpResponse, self).__init__(*args, **kwargs)

Exception Type: TypeError at /jobs/edit/
Exception Value: __init__() got an unexpected keyword argument 'pk'

Edited to add: The data saves in the database when this error occurs.

Upvotes: 0

Views: 3325

Answers (1)

masnun
masnun

Reputation: 11906

You're passing a pk to HttpResponseRedirect here:

HttpResponseRedirect('detail', pk=job.pk)

HttpResponseRedirect is supposed to redirect the user to another URL. To construct the url from your urlconf, you can use multiple approached described here: https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

I would choose to use reverse like this:

HttpResponseRedirect(reverse('detail', kwargs={"pk": job.pk}))

And the final code would look like:

from django.core.urlresolvers import reverse

# [ other codes ]

def new(request):
    if request.method == "POST":
        form = JobForm(request.POST)
        if form.is_valid():
            job = form.save(commit=False)
            user = request.user
            member = Member.objects.get(user=user)
            buyer = Buyer.objects.get(member=member)
            job.buyer = buyer
            job.buyer_paid = False
            job.freelancers_paid = False
            #job.created = timezone.now()
            job.save()
            return HttpResponseRedirect(reverse('detail', kwargs={"pk": job.pk}))

Note: The redirect function uses reverse to resolve the urls.

Upvotes: 5

Related Questions