如何将DetailView和ListView链接在一起?

时间:2016-08-02 05:15:23

标签: python django listview detailview

我正在为当地一家珠宝店建立一个演示网站,我正在尝试创建一个珠宝品牌列表(ListView)并将每个品牌链接到另一个页面的详细信息(DetailView)。我花了15个小时试图将我的ListView和我的DetailView链接在一起并且我还没有修复任何东西。这些是我与之合作的观点:

视图

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 %}

更新08/02/2016:

网址格式

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

(这是我的第一个问题,所以如果它太长了我就道歉!)

1 个答案:

答案 0 :(得分: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通常不是一个好主意 - 您要么丢失要么必须复制视图的大部分功能。