2016-08-02 58 views
0

我正在为当地珠宝店建立一个演示网站,我正在尝试创建一个珠宝品牌列表(ListView),并在其他页面中将每个品牌链接到它的描述(DetailView)。我花了坚实的15个小时尝试将我的ListView和我的DetailView链接在一起,我还没有修复任何东西。这些是我正在使用的观点:如何将我的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中点击一个对象时,对象的slug被添加到了url中,但是页面没有改变。那么如何成功地链接我的两个视图,以便DetailView获取从ListView中给出的信息?


也许我的模板可能证明方便:

模板

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存储在列表模型中,使用它的id和各自的id我会在每个iteam的DetailsModel中存储它的详细信息。因此,在发送iteam列表时,我会发送它的ID和任何我想要显示的基本信息。在点击那个特定的iteam之后,我会将与该iteam相对应的id传递给detailsView并获取Information.I将使用Ajax调用请求,以便它不会刷新我的页面。 –

+0

请显示您的网址格式。 – Alasdair

+0

@Alasdair感谢您的提及,我更新了我的文章,以便显示网址格式。 – GTech

回答

0

你的问题是在你的网址模式。您从正则表达式的末尾错过了美元。这意味着/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'), 

请注意,您可以简化您的详细视图:

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

你并不需要设置context_object_name因为默认已经是“品牌”。覆盖get对于基于泛型类的视图通常不是一个好主意 - 您可能会丢失或不得不复制视图的大部分功能。

+0

哇,可以'相信一个失踪的美元符号会这样做。非常感谢!! – GTech

相关问题