Django: la vista de detalle genérica debe llamarse con un objeto pk o con una bala

Recibiendo este error al enviar el formulario asociado con esta vista. No estoy seguro de cuál es exactamente el problema, considerando que tengo un formulario con una estructura muy similar y funciona bien.

#views.py class Facture_Creer(SuccessMessageMixin, CreateView): model = Facture template_name = "facturation/nouvelle_facture.html" form_class= FormulairFacture # 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= FormulairFacture 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\d+)', FactureView.as_view(), name='facture_consulter'), url(r'^facture/ajouter/$', Facture_Creer.as_view(), name='facture_creer'), url(r'^facture/modifier/(?P\d+)/$', Facture_Update.as_view(), name='facture_update'), url(r'^membre/ajouter/$', Membre_Creer.as_view(), name='membre_creer'), url(r'^membre/modifier/(?P\d+)/$', Membre_Update.as_view(), name='membre_update'), #url(r'membre/(?P\d+)/supprimer/$', Membre_Supp.as_view(), name='membre_delete') ) urlpatterns += staticfiles_urlpatterns() 

Debe pasar un identificador de objeto (pk o slug) para que sus vistas sepan en qué objeto están operando.

Solo para tomar un ejemplo de su urls.py :

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

Vea cómo el segundo tiene (?P\d+)/ ? Eso es pasar un pk a UpdateView para que sepa qué objeto usar. Por lo tanto, si va a facture/modifier/5/ , UpdateView modificará el objeto con un pk de 5.

Si no quieres pasar un pk o slug en tu url, deberás anular el método get_object y obtener tu objeto de otra manera. Url aquí .

Como sugiere Alex: para el comportamiento predeterminado de Django, debes usar “pk” en tu patrón de URL.

Si desea cambiar el identificador de objeto para la clave principal “pk” a un nombre diferente, puede definir pk_url_kwarg . Esto está disponible desde Django 1.4.

Hola, todos usé la nueva función path() y aquí está mi ejemplo de trabajo que estoy seguro que ayudará:

views.py:

 from django.views.generic.detail import DetailView class ContentAmpView(DetailView): model = Content template_name = 'content_amp.html' # Defaults to content_detail.html 

urls.py:

 from django.urls import path from .views import ContentAmpView # My pk is a string so using a slug converter here intead of int urlpatterns = [ path('/amp', ContentAmpView.as_view(), name='content-amp'), ] 

templates / content_amp.html

      Hello, AMPs        

Welcome to AMP - {{ object.pk }}

{{ object.titles.main }}

Reporter: {{ object.reporter }}

Date: {{ object.created_at|date }}

También tenga en cuenta que en mi settings.py , bajo TEMPLATES , tengo 'APP_DIRS': True . Más en camino aquí .

Actualización: En django 2.0.2, cambia esto a:

 url(r'^facture/modifier//$', Facture_Update.as_view(), name='facture_update'),