__init__() 得到了意外的关键字参数 'pk'
__init__() got an unexpected keyword argument 'pk'
尝试按照 this 教程进行非常小的修改,以将表单和模板应用到我的对象模型,但是 运行 遇到一个我无法解决的错误。这应该很简单,模型创建表单,表单保存并重定向到详细信息页面。
据我所知,调用 HttpResponseRedirect 是导致错误的原因,但我不知道原因或问题所在。该代码似乎与我在教程中看到的以及我在 django 表单文档页面和其他教程中看到的相匹配(尽可能接近)。也许这是愚蠢的事情,我只是没有看到它,但我已经尝试了几个小时我能做的一切,我需要另一双眼睛来看待它。请帮忙。我在这里搞砸了什么?提前致谢。
我得到的错误是:
__init__() got an unexpected keyword argument 'pk'
这是我的 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'),
]
相关views.py 观点:
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 文件:
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',
)
回溯:
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'
编辑补充:发生此错误时数据保存在数据库中。
您在此处将 pk
传递给 HttpResponseRedirect
:
HttpResponseRedirect('detail', pk=job.pk)
HttpResponseRedirect
应该将用户重定向到另一个 URL。要从您的 urlconf 构建 url,您可以使用此处描述的多种方法:https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
我会选择这样使用 reverse
:
HttpResponseRedirect(reverse('detail', kwargs={"pk": job.pk}))
最终代码如下:
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}))
注意: redirect
函数使用 reverse
来解析 url。
尝试按照 this 教程进行非常小的修改,以将表单和模板应用到我的对象模型,但是 运行 遇到一个我无法解决的错误。这应该很简单,模型创建表单,表单保存并重定向到详细信息页面。
据我所知,调用 HttpResponseRedirect 是导致错误的原因,但我不知道原因或问题所在。该代码似乎与我在教程中看到的以及我在 django 表单文档页面和其他教程中看到的相匹配(尽可能接近)。也许这是愚蠢的事情,我只是没有看到它,但我已经尝试了几个小时我能做的一切,我需要另一双眼睛来看待它。请帮忙。我在这里搞砸了什么?提前致谢。
我得到的错误是:
__init__() got an unexpected keyword argument 'pk'
这是我的 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'),
]
相关views.py 观点:
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 文件:
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',
)
回溯:
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'
编辑补充:发生此错误时数据保存在数据库中。
您在此处将 pk
传递给 HttpResponseRedirect
:
HttpResponseRedirect('detail', pk=job.pk)
HttpResponseRedirect
应该将用户重定向到另一个 URL。要从您的 urlconf 构建 url,您可以使用此处描述的多种方法:https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls
我会选择这样使用 reverse
:
HttpResponseRedirect(reverse('detail', kwargs={"pk": job.pk}))
最终代码如下:
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}))
注意: redirect
函数使用 reverse
来解析 url。