如何在 ListView 中服务之前修改 Django query_set
How to modify Django query_set before serving it in a ListView
我有一个 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 class 以便我可以解析 query_set 中所有对象的持续时间字段,从而使它们具有更易读的持续时间?
注意:要 100% 清楚,我知道如何使用 strftime
进行实际转换。我不知道的是如何访问我的 ResultsView 中的 Song.duration
字段。
您可以添加方法或 属性 到您的模型:
@property
def converted_time(self):
return <your converted time>
并在您的模板中 {{ result.converted_time }}
您可以只使用自定义模板标签。
片段
@register.filter()
def formatSeconds(s):
mins = math.floor(s / 60);
secs = math.floor(s - (mins * 60));
return "%d:%02d" % (mins, secs);
我有一个 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 class 以便我可以解析 query_set 中所有对象的持续时间字段,从而使它们具有更易读的持续时间?
注意:要 100% 清楚,我知道如何使用 strftime
进行实际转换。我不知道的是如何访问我的 ResultsView 中的 Song.duration
字段。
您可以添加方法或 属性 到您的模型:
@property
def converted_time(self):
return <your converted time>
并在您的模板中 {{ result.converted_time }}
您可以只使用自定义模板标签。
片段
@register.filter()
def formatSeconds(s):
mins = math.floor(s / 60);
secs = math.floor(s - (mins * 60));
return "%d:%02d" % (mins, secs);