从文件中确定模型实例 URL
Determine model instance from file URL
鉴于请求中的 URL 是针对已知静态文件的,我如何确定哪个模型实例引用了该文件?
如果我有几个不同的 Django 模型,每个模型都有一个 ImageField
,这些字段每个都知道如何在文件系统上存储相对路径:
# models.py
from django.db import models
class Lorem(models.Model):
name = models.CharField(max_length=200)
secret_icon = models.ImageField(upload_to='secrets')
secret_banner = models.ImageField(upload_to='secrets')
class UserProfile(models.Model):
user = models.ForeignKey(User)
secret_image = models.ImageField(upload_to='secrets')
然后模板可以渲染这些图像,使用(例如)instance.secret_banner.url
属性。
当收到相同的请求时 URL,我想在视图中处理该请求:
# urls.py
from django.urls import path
from .views import StaticImageView
urlpatterns = [
...,
path(settings.MEDIA_URL + 'secrets/<path:relpath>', StaticImageView.as_view(), name='static-image'),
]
因此StaticImageView.get
方法将传递从URL解析的relpath
参数。
那时我需要根据哪个实例为这个静态图像制作URL做更多的处理。
# views.py
from django.views.generic import View
class StaticImageView(View):
def get(self, request, relpath):
instance = figure_out_the_model_instance_from_url_relpath(relpath)
do_more_with(instance)
我不知道如何编写 figure_out_the_model_instance_from_url_relpath
代码。
我如何使用该路径查找哪个模型和哪个实例生成了 URL?
您可以从图像文件或图像的文件名中查询和获取实例。
首先从 relpath
中获取文件名,然后查询实例。
示例代码示例:
class StaticImageView(View):
def get(self, request, relpath):
fname = get_filename_from_relpath(relpath)
instance = Lorem.objects.get(secret_icon=fname)
do_more_with_instance(instance)
我假设您想要基于 secret_icon
图像。您可以根据需要进行更改。
鉴于请求中的 URL 是针对已知静态文件的,我如何确定哪个模型实例引用了该文件?
如果我有几个不同的 Django 模型,每个模型都有一个 ImageField
,这些字段每个都知道如何在文件系统上存储相对路径:
# models.py
from django.db import models
class Lorem(models.Model):
name = models.CharField(max_length=200)
secret_icon = models.ImageField(upload_to='secrets')
secret_banner = models.ImageField(upload_to='secrets')
class UserProfile(models.Model):
user = models.ForeignKey(User)
secret_image = models.ImageField(upload_to='secrets')
然后模板可以渲染这些图像,使用(例如)instance.secret_banner.url
属性。
当收到相同的请求时 URL,我想在视图中处理该请求:
# urls.py
from django.urls import path
from .views import StaticImageView
urlpatterns = [
...,
path(settings.MEDIA_URL + 'secrets/<path:relpath>', StaticImageView.as_view(), name='static-image'),
]
因此StaticImageView.get
方法将传递从URL解析的relpath
参数。
那时我需要根据哪个实例为这个静态图像制作URL做更多的处理。
# views.py
from django.views.generic import View
class StaticImageView(View):
def get(self, request, relpath):
instance = figure_out_the_model_instance_from_url_relpath(relpath)
do_more_with(instance)
我不知道如何编写 figure_out_the_model_instance_from_url_relpath
代码。
我如何使用该路径查找哪个模型和哪个实例生成了 URL?
您可以从图像文件或图像的文件名中查询和获取实例。
首先从 relpath
中获取文件名,然后查询实例。
示例代码示例:
class StaticImageView(View):
def get(self, request, relpath):
fname = get_filename_from_relpath(relpath)
instance = Lorem.objects.get(secret_icon=fname)
do_more_with_instance(instance)
我假设您想要基于 secret_icon
图像。您可以根据需要进行更改。