Получить экземпляр модели в качестве параметра представления вместо идентификатора модели - PullRequest
1 голос
/ 21 марта 2020

В laravel можно получить доступ ко всем моделям с указанием типа параметра с помощью класса модели. например:

маршруты / сеть. php

Route::get('posts/{post}', function(\App\Post $post) {
    /* 
       $post is now the model with pk in url and
       if the pk is wrong it throws an 404 automatically
    */
});

Как это возможно в django? (с функциями просмотра)

def posts(request, post_id):
    post = get_model_or_404(Post, pk=post_id)
    # ...

Вторая строка полностью шаблонна и так много повторяется в моем коде.

1 Ответ

2 голосов
/ 21 марта 2020

Для этого вы можете сделать специальный конвертер пути [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'),
    # &hellip;
]

Затем в представлении вы получите объект Post (если существует запись для этого первичного ключа) через параметр post:

app/views.py

def post(request, <b>post</b>):
    # post is here a Post object
    # &hellip;

В вашем шаблоне вы можете просто передать объект Post в {% url &hellip; %} шаблон тега , поэтому:

<a href="{% url 'post' <b>mypostobject</b> %}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...