Подтвердить что ты не робот

Django: общий вид детали должен быть вызван либо с объектом pk, либо с пугом

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

#views.py
class Facture_Creer(SuccessMessageMixin, CreateView):
    model = Facture
    template_name = "facturation/nouvelle_facture.html"
    form_class= FormulaireFacture

    # permet de retourner a l'URL pointant vers le membre modifie
    def get_success_url(self):
        return reverse_lazy('facture_consulter',kwargs={'pk': self.get_object().id})

class Facture_Update(SuccessMessageMixin, UpdateView):
    model = Facture
    template_name = "facturation/nouvelle_facture.html"
    form_class= FormulaireFacture
    success_message = "Facture mise à jour avec succes"

    # permet de retourner a l'URL pointant vers le membre modifie
    def get_success_url(self):
        return reverse_lazy('facture_consulter',kwargs={'pk': self.get_object().id})

#urls.py
urlpatterns = patterns('',
    url(r'^$', TemplateView.as_view(template_name="facturation/index.html")),
    url(r'^facture/$', FactureView.as_view()),
    url(r'^facture/(?P<id>\d+)', FactureView.as_view(), name='facture_consulter'),
    url(r'^facture/ajouter/$', Facture_Creer.as_view(), name='facture_creer'),
    url(r'^facture/modifier/(?P<pk>\d+)/$', Facture_Update.as_view(), name='facture_update'),
    url(r'^membre/ajouter/$', Membre_Creer.as_view(), name='membre_creer'),
    url(r'^membre/modifier/(?P<pk>\d+)/$', Membre_Update.as_view(), name='membre_update'),
    #url(r'membre/(?P<pk>\d+)/supprimer/$', Membre_Supp.as_view(), name='membre_delete')
)

urlpatterns += staticfiles_urlpatterns()
4b9b3361

Ответ 1

Вам нужно передать идентификатор объекта (pk или slug), чтобы ваши представления знали, на какой объект они работают.

Чтобы взять пример из urls.py:

url(r'^facture/ajouter/$', Facture_Creer.as_view(), name='facture_creer'),
url(r'^facture/modifier/(?P<pk>\d+)/$', Facture_Update.as_view(), name='facture_update'),

Посмотрите, как второй имеет (?P<pk>\d+)/? Это передача pk в UpdateView, чтобы он знал, какой объект использовать. Таким образом, если вы перейдете к facture/modifier/5/, то UpdateView изменит объект с помощью pk из 5.

Если вы не хотите передавать pk или slug в свой url, вам нужно переопределить метод get_object и получить свой объект по-другому. Url здесь.

Ответ 2

Как говорит Алекс: для поведения Django по умолчанию вам нужно использовать "pk" в вашем шаблоне url.

Если вы хотите изменить идентификатор объекта для первичного ключа "pk" на другое имя, вы можете определить pk_url_kwarg. Это доступно с Django 1.4.