我正在为当地一家珠宝店建立一个演示网站,我正在尝试创建一个珠宝品牌列表(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'),
(这是我的第一个问题,所以如果它太长了我就道歉!)
答案 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
通常不是一个好主意 - 您要么丢失要么必须复制视图的大部分功能。