2017-06-30 4 views
1

ユーザーが検索できる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フィールドにアクセスする方法です。

答えて

5

あなたはあなたのモデルにメソッドまたはプロパティを追加することができます。

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

そして、あなたのテンプレートに{{ result.converted_time }}

+1

私はこれを試してみました。完璧に動作し、実装には約12秒かかりました。ありがとうございました! – Sam

+0

あなたは非常に歓迎です。=) –

+0

@Samあなたは答えを受け入れることをお勧めします。私はそれが類似の問題を抱えていると他の人がそれを見つけるのを助けると思う。 (それは私たちのカルマにも良いです;)) –

3

をあなただけのカスタムテンプレートタグを使用することができます。

Ref

スニペットは

@register.filter() 
def formatSeconds(s): 
    mins = math.floor(s/60); 
    secs = math.floor(s - (mins * 60)); 
    return "%d:%02d" % (mins, secs); 
+0

実際のコードだけでなくリンクも掲載するほうがいいかもしれません。リンクが死んでいる場合に備えて= –

+0

お返事ありがとうございます。残念ながら、あなたはちょうど@The_Cthulhu_Kidに殴られました。それでも、将来にわたってこの問題を抱える人には、複数のソリューションを用意することは良いことです。 – Sam

+0

@The_Cthulhu_Kidが何をしたのかという問題を解決したいと思います。私はモデルで変更する権限がないなら、今後Q&Aを訪問する別の男のためにこの答えを与えました – Swagat

関連する問題