__init __ () получил неожиданный аргумент ключевого слова 'pk'

Попытка следовать этому руководству с очень небольшими изменениями, чтобы применить форму и шаблон к моему модель объекта, но я не могу обойтись без ошибки. Это должно быть просто: модель создает форму, форма сохраняет и перенаправляет на страницу сведений.

Насколько я могу судить, вызов 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'

Отредактировано для добавления: данные сохраняются в базе данных при возникновении этой ошибки.


person f71316    schedule 23.12.2015    source источник
comment
Почему вы передаете pk аргумент HttpResponseRedirect? Что вы ожидали от этого?   -  person user2357112 supports Monica    schedule 23.12.2015
comment
В учебнике используется django.shortcuts.redirect. Вы используете HttpResponseRedirect напрямую. Аргументы, которые они приводят, разные.   -  person user2357112 supports Monica    schedule 23.12.2015
comment
@ user2357112 - Я следил за инструкциями, я ожидал, что передадим pk, чтобы отобразить правильный экземпляр объекта задания на странице сведений. Я пропустил это изменение с django.shortcuts.redirect на HttpResponseRedirect. У меня это не сработало, поэтому я поискал в Google несколько других руководств и пробовал примеры из документации форм django, но все безуспешно.   -  person f71316    schedule 23.12.2015


Ответы (1)


Здесь вы передаете pk пользователю HttpResponseRedirect:

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

HttpResponseRedirect должен перенаправлять пользователя на другой URL. Чтобы создать URL-адрес из вашего urlconf, вы можете использовать несколько подходов, описанных здесь: 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 < / a> функция использует reverse для разрешения URL-адресов.

person masnun    schedule 23.12.2015
comment
Теперь я получаю сообщение об ошибке «Недопустимый синтаксис» со ссылкой на измененную строку HttpResponseRedirect в моем файле views.py. - person f71316; 23.12.2015
comment
У вас есть синтаксическая ошибка в этой строке. Трудно сказать, не увидев полного кода. - person masnun; 23.12.2015
comment
Это полная строка 35 return HttpResponseRedirect(reverse('detail', args=(pk=job.pk))) - person f71316; 23.12.2015
comment
Пожалуйста, попробуйте: HttpResponseRedirect(reverse('detail', kwargs={"pk": job.pk})) - Я забыл, что это должно быть kwargs, а не args - person masnun; 23.12.2015
comment
пришлось изменить его, чтобы включить указанное приложение, но это сработало. Спасибо! Окончательный рабочий код HttpResponseRedirect(reverse('jobs:detail', kwargs={"pk": job.pk})) - person f71316; 23.12.2015
comment
Ах, у вас было пространство имен. - person masnun; 23.12.2015