2016-08-02 6 views
0

私は地元の宝飾店のデモウェブサイトを構築しており、ジュエリーブランドのリスト(ListView)を作成し、それぞれの説明(DetailView)を別のページにリンクしようとしています。私はListViewとDetailViewをリンクさせようとしっかりした15時間を過ごしました。何も修正していません。これらは、私が働いている図である。DetailViewとListViewを一緒にリンクするにはどうしたらいいですか?

ビューこの最初のビューのために

class BrandView(ListView): 
    template_name = 'products.html' 
    queryset = models.Brand.objects.order_by('brand_name') 
    context_object_name = 'brand_list' 

、私は、それに対応する詳細ページへのリンクとしてクエリセットから各オブジェクトを表示するテンプレートを作成しました次のビューで表現する必要があります。私も通常の関数としての最後のビューを書いてみました

class TextView(DetailView): 
    template_name = 'brands/brand_text.html'  
    context_object_name = 'brand' 

    def get(self, request, slug): 
     # Grabs the Brand object that owns the given slug 
     brand = models.Brand.objects.get(slug = slug) 

     # renders self.template_name with the given context and model object 
     return render(request, self.template_name, self.context_object_name) 

が、これはどちらか何かを達成していません。

def text_view(request, slug): 
    brand = models.Brand.objects.get(slug = slug) 
    return render(request, 'brands/brand_text.html', {'brand': brand,}) 

基本的に、ListViewからオブジェクトをクリックすると、オブジェクトのスラッグがURLに追加されますが、ページは変更されません。だから、どのようにしてDetailViewがListViewから与えられた情報を取得するように2つのビューを正常にリンクできますか?


おそらく私のテンプレートが便利証明するかもしれない:

テンプレート

brand_text.html

{% block content %} 
    <div class= "brands" style="animation: fadein 1.5s 1;"> 
      <p> 
       <a class = "nav_link" href="{% url 'products' %}">Back</a> 
      </p> 
    </div> 

    <div class= "brand_descriptions"> 
     <p>{{ brand.description }}</p> 
    </div> 

{% endblock %} 

products.html

{% block content %} 
    <div class= "brands" style="animation: fadein 1.5s 1;"> 
     {% for item in brand_list %} 
      <p> 
       <a class = "nav_link" href="{% url 'brand_text' item.slug %}">{{ item.brand_name }}</a> 
      </p> 
     {% endfor %} 
    </div> 

{% endblock %} 

UPDATE 2016年8月2日:

URLパターン

url(r'^products/', BrandView.as_view(), name = 'products'), 
url(r'^products/(?P<slug>[-\w]+)', TextView.as_view(), name = 'brand_text'), 

(!これが私の最初の質問ですので、それはあまりにも長い間だ場合、私は謝罪)

+0

あなたはそれをそれぞれのiteamのためにDetailsModelに保存しておきたいと思っています。それを私が見せたいと思っている基本情報とは何であれ、それを送る。そのperticular iteamをクリックした後、私はdetailsViewにそのiteamに対応するidを渡し、Information.Iは私のページをリフレッシュしないようにリクエストするAjaxコールを使用します。 –

+0

あなたのURLパターンを示してください。 – Alasdair

+0

@Alasdair言及してくれてありがとう、私はURLパターンが表示されるように自分の投稿を更新しました。 – GTech

答えて

0

あなたの問題がありますあなたのURLパターンで。あなたはあなたの正規表現の終わりからドルを逃しました。つまり、/products/my-slug/BrandViewの代わりにTextViewの正規表現と一致します。あなたがあなたの詳細ビューを簡素化することができます

url(r'^products/$', BrandView.as_view(), name = 'products'), 
url(r'^products/(?P<slug>[-\w]+)$', TextView.as_view(), name = 'brand_text'), 

注:あなたは、デフォルトがすでに「ブランド」であるため、context_object_nameを設定する必要はありません

class TextView(DetailView): 
    template_name = 'brands/brand_text.html' 

に変更します。 getを汎用クラスベースのビューに上書きすることは、通常はお勧めできません。ビューの機能の多くを失うか、または複製する必要があります。

+0

うわー、行方不明のドル記号がそれをすると信じていない。どうもありがとう!! – GTech

関連する問題