基于模型名的Django动态url模式:如何实现?

2024-05-14 18:51:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我搜索了一段时间,但还是没有找到答案。 假设我们有一个models.py,有3个模型,分别是狗、猫和鸟。在url.py中,我们希望有一行代码,用于处理每种模型类型的通用ListView和DetailView。我们的views.py是动态的,接受url.py中的模型

EAX示例的smth:

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'),
]

所以当我们转到…/动物/狗时,它会从狗那里加载数据,或者当我们转到…/动物/猫时,我们会从猫表中获取数据,等等。 我们如何做到这一点?

另外,我有基于generic的working views.py,所以我不在这里分享:)


Tags: pathdjango答案代码namefrompy模型
2条回答

也许使用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条件扩展lambda即可

首先,我将创建一个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)

如果你需要更多的细节,请告诉我

相关问题 更多 >

    热门问题