Django Dynami c Шаблон URL на основе названий моделей: как это сделать? - PullRequest
0 голосов
/ 02 февраля 2020

Я искал это некоторое время и так и не понял. Допустим, у нас есть models.py с 3 моделями собак , кошек и птиц . В url.py мы хотим иметь одну строку, которая работает с generi c ListView и DetailView для каждого типа модели. Наш views.py это динамический c и принимает модели из url.py.

что-то для eaxmple:

from django.urls import path
from django.views.generic import TemplateView
from . import views
from . import models
urlpatterns = [
    path('animals/<???>/', views.AnimalList.as_view(template_name = 'animals.html', model = ???), name='lots'),
]

, поэтому, когда мы go в ... / животные / собаки , он загружает данные от собак, или когда мы go в ... / animals / cats, мы получаем данные из таблицы cats и так далее. Как нам это сделать?

ps У меня есть рабочий views.py, основанный на generi c, поэтому я не делюсь им здесь:)

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Возможно, это сработает для ваших нужд при использовании модуля inspect :

import sys, inspect

from django.db.models import Model
from django.urls import path
from django.views.generic import TemplateView
from . import views
from . import models

# find classes in models.py
is_class_member = lambda member: inspect.isclass(member)
class_members = inspect.getmembers(sys.modules['your_app_name.models'], is_class_member)

urlpatterns = [
path(f'animals/{item[0]}/', views.AnimalList.as_view(template_name = 'animals.html', model = item[1]), name='lots') for item in class_members]

Возможно, вам придется заполнить your_app_name или найти правильное имя в пространстве имен. Кроме того, вы можете захотеть применить некоторые дополнительные параметры фильтрации к поиску моделей - просто расширьте лямбду, добавив условия and / or.

0 голосов
/ 02 февраля 2020

Я бы начал с создания функции views, которая принимает запрос и заголовок типа животного. Функция будет искать данные на основе заголовка и затем отображать шаблон. Примерно так:

# urls.py:

urlpatterns = [
    path('animals/<???>/', views.GetAnimalData, name='lots'),
]


# views.py:

def GetAnimalData(request, animal):

    # 1) look up animal data in database:
    if animal == 'Dog':
        animal_data = Dog.objects.get() # specify query set here
    elif animal == 'Cat':
        animal_data = Cat.objects.get()
    elif ...

    # 2) pack data into context:
    context = {
        'name' : animal_data.name,
        'color' : animal_data.color, 
        ...
    }

    # 3) render template with context:
    return render(request, 'animals.html', context=context)

Дайте мне знать, если вам нужно больше деталей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...