我正在寻找关于如何实施以下系统的一些概念性指导。
我目前有一个可以返回模型实例列表的搜索工具,例如如果我的模型是Cats,我的搜索会返回数据库中所有Cats的列表。
我想要实现的是为我的模型的每个实例分配一个url,这样用户可以在返回搜索结果时单击它并将其带到填充了的页面中与该模型实例有关的其他相关信息。该系统必须是动态的,因为我的数据库可能包含数百或数千个条目。
据我了解,我将要求以下内容:
然而,由于我是Django和python的新用户,我不知道这一切是如何组合在一起的。 我特别不确定如何分配和路由网址。非常感谢任何指导。
提前谢谢!
P.S。请注意,我并不是在寻找代码,只是工作流程或其他有关此系统如何工作的表示。
/////// EDIT ///////
大家好,感谢所有回复。如果没问题,我想在结束这个问题之前先请求一些额外的帮助。
我看了一下答案,并迅速尝试创建解决方案。但是,我相信我遇到了get_absolute_url函数的一些问题,它似乎没有返回任何内容或空字符串(无法告诉)。
这是我的基本代码:
MODELS.py
class Cats(models.Model):
name = models.CharField(max_length=20)
@models.permalink
def get_absolute_url(self):
return "catspage", self.name
RESULTS.html
{% for result in page.object_list %}
<p>
<a href="{{ result.object.get_absolute_url }}">{{ result.object }}</a>
</p>
{% empty %}
<p>No results found.</p>
{% endfor %}
URLS.py
urlpatterns = patterns('',
url(r'^CatsView/(?P<name>-[w]+)/$', views.CatsView.as_view(), name='catspage'))
VIEWS.py
from django.views import generic
class CatsView(generic.DetailView):
model = Cats
template_name = 'catsdb/object.html'
因此,其工作方式是另一个视图输出到名为results.html的页面,我的搜索功能的结果,即上面的result.object
。
因此,在此模板中,每个结果应链接到其在models.py中定义的绝对URL。然后是一个通用视图DetailView,它通过URL配置将绝对URL路由到页面object.html。
错误:链接为空,网址为空。
答案 0 :(得分:1)
Django内置了一些视图来完成你想要做的事情!
合并ListView
和DetailView
应符合您的要求。文档链接提供了urlconf示例。
您可以使用ListView
获取系统中的所有Cat
个实例,然后进行渲染。 Django有一个使用名为get_absolute_url
的模型实例方法的约定来获取查看单个实例的链接。该链接应指向您设置为DetailView
个实例的Cat
。
ListView
加载所有Cat
个实例DetailView
get_absoulte_url
的链接呈现cat实例
DetailView
呈现单个Cat
实例。重要的是,django提供了所有工具(以ClassBasedViews的形式)来完成你在问题中概述的内容
答案 1 :(得分:0)
您可以使用models.permalink来定义对象的网址。
from django.db import models
class Cat(models.Model):
name = models.CharField(max_length=32)
@models.permalink
def get_absolute_url(self):
return ('cats_detail', [self.pk])
然后,您可以使用通用视图并创建名为url的“cat_detail”。
https://docs.djangoproject.com/en/dev/ref/class-based-views/generic-display/
在模板中:<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
答案 2 :(得分:0)
我将举例说明我通常如何做到这一点。例如,我可以使用cat的名称作为我的网址的slu ..
看看它是否有帮助:
#models.py
from django import models
from django.template.defaultfilters import slugify
from django.db.models import signals
from django.core.urlresolvers import reverse
class Cat(models.Model):
name = models.CharField(max_length = 200)
slug = models.SlugField(blank=True,null=True)
def get_absolute_url(self):
return reverse('see-cat',
kwargs=(
{'slug':self.slug})
)
#Signals
def slug_pre_save(signal, instance, sender, **kwargs):
"""
This is a pre-save signal. It will put a value into slugify before it is saved on the model.
"""
if not instance.slug:
slug = slugify(instance.name)
new_slug = slug
cont = 0
while sender.objects.filter(slug=new_slug).exclude(id=instance.id).count() > 0:
cont +=1
new_slug = '%s-%d' % (slug,cont)
instance.slug = new_slug
#Now I gonna connect the signal and the Cat Class
signals.pre_save.connect(slug_pre_save, sender=Cat)
#urls.py
url(r'^see-cat/(?P<slug>[\w_-]+)/$',
'your_see_cat_view',name='see-cat'),