46π
You need to pass an object identifier (pk or slug) so your views know which object theyβre operating on.
Just to take an example from your 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'),
See how the second one has (?P<pk>\d+)/
? That is passing a pk to the UpdateView so it knows which object to use. Thus if you go to facture/modifier/5/
, then the UpdateView will modify object with pk of 5.
If you donβt want to pass a pk or slug in your url, youβll need to override the get_object() method and get your object another way. Url here.
17π
As Alex suggests: for default Django behaviour you have to use βpkβ in your url pattern.
If you wish to change the object identifier for the primary key βpkβ to a different name, you can define pk_url_kwarg. This is available since Django 1.4.
- [Django]-What is PyMySQL and how does it differ from MySQLdb? Can it affect Django deployment?
- [Django]-How can I get the file name from request.FILES?
- [Django]-Pycharm error Django is not importable in this environment
8π
Hey all I used the new path()
function and here is my working example that Iβm sure will help:
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('<slug:pk>/amp', ContentAmpView.as_view(), name='content-amp'),
]
templates/content_amp.html
<!doctype html>
<html amp lang="en">
<head>
<meta charset="utf-8">
<script async src="https://cdn.ampproject.org/v0.js"></script>
<title>Hello, AMPs</title>
<link rel="canonical" href="http://example.ampproject.org/article-metadata.html">
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "NewsArticle",
"headline": "Open-source framework for publishing content",
"datePublished": "2015-10-07T12:02:41Z",
"image": [
"logo.jpg"
]
}
</script>
<style amp-boilerplate>
body{-webkit-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-moz-animation:-amp-start 8s steps(1,end) 0s 1 normal both;-ms-animation:-amp-start 8s steps(1,end) 0s 1 normal both;animation:-amp-start 8s steps(1,end) 0s 1 normal both}@-webkit-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-moz-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-ms-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@-o-keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}@keyframes -amp-start{from{visibility:hidden}to{visibility:visible}}
</style>
<noscript>
<style amp-boilerplate>body{-webkit-animation:none;-moz-animation:none;-ms-animation:none;animation:none}
</style>
</noscript>
</head>
<body>
<h1>Welcome to AMP - {{ object.pk }}</h1>
<p>{{ object.titles.main }}</p>
<p>Reporter: {{ object.reporter }}</p>
<p>Date: {{ object.created_at|date }}</p>
</body>
</html>
Also note that in my settings.py
, under TEMPLATES
, I have 'APP_DIRS': True
. More on path here.
- [Django]-Django admin: How to display the field marked as "editable=False" in the model?
- [Django]-Pip install PIL fails
- [Django]-Django South β table already exists
6π
Like Robin said, you can use pk_url_kwarg
if you want custom pk name.
But as addition, issue Generic detail view must be called with either an object pk or a slug raises also in slug.
So if you want to create custom slug field (no need to use pk or slug name). You can override slug_field
and slug_url_kwarg
in your DetailView class.
Here is just another example if you want url as Slug Field.
models.py
class Post(models.Model):
title = models.CharField(max_length=255)
url = models.SlugField()
body = models.TextField()
image = models.ImageField(upload_to='blog/', blank=True, null=True)
views.py
class ListPost(ListView):
model = Post
template_name = 'blog/list.html'
paginate_by = 2
context_object_name = 'posts'
class DetailPost(DetailView):
model = Post
template_name = 'blog/detail.html'
slug_field = 'url'
slug_url_kwarg = 'url'
urls.py
urlpatterns = [
path('', ListPost.as_view()),
path('<slug:url>/', DetailPost.as_view()),
]
- [Django]-In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited?
- [Django]-Sqlite3.OperationalError: unable to open database file
- [Django]-Django dynamically filtering with q objects
2π
I am using Django version 2.2.12,
Here is just another example this works fine for me :
models.py
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=256)
author = models.CharField(max_length=256)
pages = models.IntegerField()
price = models.FloatField()
views.py
from django.views.generic import ListView,DetailView
from testapp.models import Book
class BookListView(ListView):
model=Book
class BookDetailView(DetailView):
model=Book
urls.py
from django.contrib import admin
from django.urls import path
from testapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('', views.BookListView.as_view()),
path('<slug:pk>/', views.BookDetailView.as_view()),
]
- [Django]-Are there any plans to officially support Django with IIS?
- [Django]-Django applying a style class based on a conditional
- [Django]-Django.contrib.auth.logout in Django
-3π
Update: In django 2.0.2, change this to:
url(r'^facture/modifier/<int:pk>/$', Facture_Update.as_view(), name='facture_update'),
- [Django]-Suddenly when running tests I get "TypeError: 'NoneType' object is not iterable
- [Django]-How to force application version on AWS Elastic Beanstalk
- [Django]-Uninstall Django completely