Skip to main content
 首页 » 编程设计

python之如何在 ListView 中提供之前修改 Django 查询集

2025年05月04日22zhoujg

我有一个 Django 项目,其中包含用户可以搜索的歌曲对象数据库。

我的 models.py 看起来像这样:

class Songs(models.Model): 
 
    title = models.CharField(max_length=100) 
    artist = models.CharField(max_length=100) 
    link = models.CharField(max_length=255, unique=True) 
    album = models.CharField(max_length=100) 
    duration = models.CharField(max_length=40)  # Duration in num_secs 

我的 views.py 看起来像这样:

class ResultsView(ListView): 
 
    template_name = os.path.join(APPNAME, "results.html") 
    model = Songs 
    context_object_name = 'results' 
    paginate_by = 60 
    ordering = ['title'] 
 
    def get_context_data(self, **kwargs): 
 
        context = super(ResultsView, self).get_context_data(**kwargs) 
        context['query'] = self.request.GET.get('query') 
        return context 
 
    def get_queryset(self, **kwargs): 
 
        query = self.request.GET.get('query') 
        query_set = Songs.objects.all() 
        results = query_set.filter(title__icontains=query) 
        return list(results) 

我的 results.html 模板如下所示:

{% if results %} 
    <div class="container-fluid"> 
        <div class="row"> 
    {% for result in results %} 
        <div class="col-md-2 result-col"> 
            <a data-toggle="tooltip" title="{{ result.title }}" target="_blank" href="/song/{{ result.id }}"> 
                <div class="result-text">{{ result.title }} </div> 
                <div class="result-dur">{{ result.duration }}</div> 
            </a> 
        </div> 
 
        {% endfor %} 
        </div> 
    </div> 
{% else %} 
    <h2>No Results</h2> 
{% endif %} 

由于数据最初存储在我的数据库中的方式,每首歌曲的持续时间存储为秒数,即一首 2 分钟长的歌曲存储时长为 120。但是,我想以“hh:mm:ss”格式显示在模板上。

如何修改我的 ResultsView 类,以便我可以解析我的 query_set 中所有对象的持续时间字段,从而使它们具有更易读的持续时间?

注意:要 100% 清楚,我知道如何使用 strftime 进行实际转换。我不知道的是如何访问我的 ResultsView 中的 Song.duration 字段。

请您参考如下方法:

您可以向您的模型添加一个方法或属性:

@property 
def converted_time(self): 
    return <your converted time> 

在你的模板中 {{ result.converted_time }}