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()
Ответы
Ответ 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.