Reputation: 252
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
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