Для этого вы можете сделать специальный конвертер пути [Django -doc] . Например, мы можем сделать конвертер пути модели:
# app/converters.py
from django.shortcuts import get_object_or_404
from django.urls.converters import IntConverter
class ModelConverter(IntConverter):
model = None
def to_python(self, value):
return <b>get_object_or_404(</b>self.model, pk=super().to_python(value)<b>)</b>
def to_url(self, value):
if instanceof(value, int):
return str(value)
return str(value.pk)
def model_converter(model):
class Converter(ModelConverter):
model = model
return Converter
Затем в вашем urls.py
вы можете сделать конвертеры модели и зарегистрировать их один раз:
# app/urls.py
from app.converters import model_converter
from app import views
from app.models import Post
from django.urls import path, register_converter
register_converter(model_converter(Post), '<b>post</b>')
urlpatterns = [
path('posts/<<b>post:</b>post>', views.post, name='post'),
# …
]
Затем в представлении вы получите объект Post
(если существует запись для этого первичного ключа) через параметр post
:
app/views.py
def post(request, <b>post</b>):
# post is here a Post object
# …
В вашем шаблоне вы можете просто передать объект Post
в {% url … %}
шаблон тега , поэтому:
<a href="{% url 'post' <b>mypostobject</b> %}">