在Django中创建模型实例视图



我正在寻找一些关于我应该如何实现以下系统的概念指导。

我目前有一个搜索工具,可以返回模型实例列表,例如,如果我的模型是猫,我的搜索返回数据库中所有猫的列表。

我想要实现的是为我的模型的每个实例分配一个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内置了视图来做你想做的事情!

结合ListViewDetailView应满足您的要求。文档链接提供了urlconf示例。

您可以使用ListView获取系统中的所有Cat实例,并呈现它们。Django有一个惯例,使用一个名为get_absolute_url的模型实例方法来获取查看单个实例的链接。该链接应该指向您为呈现Cat实例而设置的DetailView

  1. 使用ListView加载所有Cat实例
  2. 使用get_absoulte_url渲染带有DetailView链接的cat实例
  3. 使用DetailView渲染单个Cat实例
重要的是,django提供了所有的工具(以ClassBasedViews的形式)来完成你在问题
中概述的内容。

您可以使用模型。永久链接定义对象的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'),

最新更新