ユーザーが検索できるSongオブジェクトのデータベースを持つDjangoプロジェクトがあります。Django query_setをListViewで提供する前にDjango query_setを変更する方法
マイ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 %}
データが最初にDBに保存されるため、各曲の長さは秒数として保存されます。 2分の長さの曲が120の長さで保存されます。ただし、テンプレートに "hh:mm:ss"の形式で表示します。
ResultsViewクラスを変更して、query_set内のすべてのオブジェクトの期間フィールドを解析して、より読みやすくなるようにするにはどうすればよいですか?
注:実際の変換を行う方法を100%明確にするため、strftime
を使用しています。私が知りませんが、私のResultsViewのSong.duration
フィールドにアクセスする方法です。
私はこれを試してみました。完璧に動作し、実装には約12秒かかりました。ありがとうございました! – Sam
あなたは非常に歓迎です。=) –
@Samあなたは答えを受け入れることをお勧めします。私はそれが類似の問題を抱えていると他の人がそれを見つけるのを助けると思う。 (それは私たちのカルマにも良いです;)) –