我正在寻找一些关于我应该如何实现以下系统的概念指导。
我目前有一个搜索工具,可以返回模型实例列表,例如,如果我的模型是猫,我的搜索返回数据库中所有猫的列表。
我想要实现的是为我的模型的每个实例分配一个url,这样用户可以在返回搜索结果时单击它,并被带到一个填充了与该模型实例相关的其他相关信息的页面。这个系统必须是动态的,因为我的数据库可能包含数百或数千个条目。
根据我的理解,我需要以下内容:
- 为模型的每个实例动态分配url
- 一个URL配置,将每个实例的唯一URL传递给视图
- 一个视图,它可以破译URL指向模型的哪个实例,并使用相关元素动态地填充模板
然而,作为Django和python的新用户,我不确定这些将如何结合在一起。我特别不确定如何分配和路由url。任何指导将不胜感激。
提前感谢!
注:请注意,我并不是真的在寻找代码,只是可能是一个工作流或其他一些系统如何工作的表示。
///////编辑///////
大家好,感谢大家的回复。如果可以的话,在我结束这个问题之前,我想请求一些额外的帮助。
我看了一下答案,并快速尝试创建一个解决方案。然而,我相信我有一些问题与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
的结果。
因此,在这个模板中,每个结果都应该链接到它的绝对url,在models.py中定义。还有一个通用视图DetailView,通过URL配置,应该路由绝对URL到页面object.html。
链接为空,url为空
Django内置了视图来做你想做的事情!
结合ListView
和DetailView
应满足您的要求。文档链接提供了urlconf示例。
您可以使用ListView
获取系统中的所有Cat
实例,并呈现它们。Django有一个惯例,使用一个名为get_absolute_url
的模型实例方法来获取查看单个实例的链接。该链接应该指向您为呈现Cat
实例而设置的DetailView
。
- 使用
ListView
加载所有Cat
实例 - 使用
get_absoulte_url
渲染带有DetailView
链接的cat实例 - 使用
DetailView
渲染单个Cat
实例
您可以使用模型。永久链接定义对象的url。
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>
我将给出一个我通常是如何做的例子。例如,我可以使用猫的名字作为url地址的段塞。
看看是否有帮助:
#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'),