2016-09-06 5 views
2

ユーザの検索後に基本的な詳細を含むムービーのリストを返すページを作成しています。django:返された結果のリストから詳細ページへのリンク

検索後、私はユーザーがムービーをクリックして詳細を知りたいと思います。データはTMDB's apiから来ていると、最初の「汎用」の検索JSONレスポンスが」doesnの(私は2ヶ月前にこのようなものを学び始め、穏やかなほら!)http://moniblog.pythonanywhere.com/compare/

はこちらのサイトへのリンクですムービーの詳細ページに表示される特定の詳細はありますが、特定のムービーの検索に使用されるIDがあります。

私は、検索結果を取得/表示するためにのみviews.pyを使用しています。これが正しい方法か、モデルを使用すべきかどうかは分かりませんが、それはおそらく別の質問です。

forms.py:

from django import forms 


class MovieSearch(forms.Form): 
    moviename = forms.CharField(label="Search", max_length=250) 

views.py:

from django.shortcuts import render, get_object_or_404 
from django.conf import settings 

from .forms import MovieSearch 
import tmdbsimple as tmdb 

tmdb.API_KEY = settings.TMDB_API_KEY 


def search_movie(request): 
    parsed_data = {'results': []} 
    if request.method == 'POST': 
     form = MovieSearch(request.POST) 
     if form.is_valid(): 
      search = tmdb.Search() 
      query = form.cleaned_data['moviename'] 
      response = search.movie(query=query) 
      for movie in response['results']: 
       parsed_data['results'].append(
        { 
         'title': movie['title'], 
         'id': movie['id'], 
         'poster_path': movie['poster_path'], 
         'release_date': movie['release_date'][:-6], 
         'popularity': movie['popularity'], 
         'overview': movie['overview'] 
        } 
       ) 
      for i in range(2, 5 + 1): 
       response = search.movie(query=query, page=i) 
       for movie in response['results']: 
        parsed_data['results'].append(
         { 
          'title': movie['title'], 
          'id': movie['id'], 
          'poster_path': movie['poster_path'], 
          'release_date': movie['release_date'][:-6], 
          'popularity': movie['popularity'], 
          'overview': movie['overview'] 
         } 
        ) 
      context = { 
       "form": form, 
       "parsed_data": parsed_data 
      } 
      return render(request, './moviecompare/movies.html', context) 
     else: 
      form = MovieSearch() 
    else: 
     form = MovieSearch() 

    return render(request, './moviecompare/compare.html', {"form": form}) 

とhtml:

{% extends 'moviecompare/compare.html' %} 

{% block movies_returned %} 
<div class="wrap"> 
<div class="compare-gallery"> 
{% for key in parsed_data.results|dictsortreversed:'release_date' %} 
{% if key.poster_path and key.release_date and key.title and key.overview %} 
    <div class="gallery-item"> 
     <img src="http://image.tmdb.org/t/p/w185/{{ key.poster_path }}"> 
    <div class="gallery-text"> 
     <div class="gallery-date"><h5><span><i class="material-icons">date_range</i></span> {{ key.release_date }}</h5></div> 
     <div class="gallery-title"><h3><a href="../detail/{{ key.id }}">{{ key.title }}</a></h3></div> 
     <div class="gallery-overview">{{ key.overview|truncatechars:80 }}</div> 
     </div> 
    </div> 
{% endif %} 
{% endfor %} 
</div> 
</div> 
{% endblock %} 

私が何かにを取得するために、urls.pyで遊んで始めました仕事は、しかし、これまで運がない。

サイトのurls.py:

urlpatterns = [ 
    url(r'^$', home, name="home"), 
    url(r'^blog/', include('blog.urls', namespace='blog')), 
    url(r'^compare/', include('moviecompare.urls', namespace='compare')), 
    url(r'^movies/', include('moviecompare.urls', namespace='movies')), 

とアプリのurls.py:

​​

編集:私の第一の追加(失敗した)映画の詳細ビューの試み:

def get_movie(request, movid=None): 
    instance = get_object_or_404(request, movid=movid) 
    context = { 
     'instance': instance 
    } 
    return render(request, './moviecompare/detail.html', context) 
+0

'url(r' ^(?P [0-9])+ $ '、views。get_movie、name = 'movies') 'このビューはビューファイルで定義されていません。 –

+0

@BernardParahはい、これは私が困っているところです。私はに向けてこのディテールのビューを作成する方法がわかりません。そのURLはちょうど私が表示する "何か"を得るために異なるものを試しています。私がこれをテストするために作ったビュー関数は、 'DEF get_movie(リクエスト、movid =なし):= get_object_or_404 インスタンス(要求、movid = movid) コンテキスト= { 'インスタンス':インスタンス }リターン「は、(リクエストをレンダリング./moviecompare/detail.html '、context) ' – Jon

+0

私は、ムービーのIDまたはタイトルを表示し、詳細ビューを表示するには一般的な詳細ビューを使用します。詳細ページでは、APIをもう一度呼び出すことなく、すべての追加情報を追加することができます。 –

答えて

1

この行にurls.pyを固定してみてください:

url(r'^(?P<movid>[0-9])+$', views.get_movie, name='movies') 
は、「+」そんなカッコ内を移動

url(r'^(?P<movid>[0-9]+)$', views.get_movie, name='movies') 
0

私はいくつかの必要な微調整と一緒に、ローマの答えあたりURLPATTERNを固定することにより、この作業を取得することができました。

urlpatterns = [ 
    url(r'^(?P<movid>[0-9]+)$', views.get_movie, name='movie_detail'), 
    url(r'^', views.search_movie, name='compare'), 
] 

と私が持っているルートurls.pyで:私は順序を変更するために必要なアプリのurls.pyで

url(r'^compare/', include('moviecompare.urls', namespace='compare')), 

ビューに機能を追加しました:

def get_movie(request, movid): 
    movie = tmdb.Movies(movid) 
    response = movie.info() 
    context = { 
     'response': response 
    } 
    return render(request, './moviecompare/detail.html', context) 

とhtmlに詳細をリンクするために、これを使用:

{% url 'compare:movie_detail' movid=key.id %} 
関連する問題