开发者

django: how can i make a generic list view see a regular model?

Sorry if this is a dumb way to ask this... I have a generic list view for the homepage of a site, and would like to use a "homepage" model for informative text on that same page...is it possible? Thanks for your help.

models.py

from django.db import models


class School(models.Model):
    school_name = models.CharField(max_length=250, help_text='Maximum 250 characters.')
    slug = models.SlugField(unique=True)

    def __unicode__(self):
        return self.school_name

def get_absolute_url(self):
        return "/schools/%s/" % self.slug

class Student(models.Model):
    name = models.CharField(max_length=250, help_text='Maximum 250 characters.')
    slug = models.SlugField(unique=True)
    mugshot = models.ImageField(upload_to='mugshots')
    school = models.ForeignKey(School)  
    honor = models.TextField()

    def __unicode__(self):
        return self.name

    def get_absolute_url(self):
        return "/student/%s/" % self.slug

class Homepage(models.Model):
    title = models.CharField(max_length=250, help_text='Maximum 250 characters.')
    content = models.TextField() 

    def __unicode__(self):
        return self.title

urls.py

from django.conf.urls.defaults import *
from achievers.apps.students.models import School, Student
from achievers.apps.students.views import hello

from django.contrib import admin
admin.autodiscover()

info_dict = {
    'queryset': School.objects.all(),
    'extra_context': {'school_list': Sch开发者_运维问答ool.objects.all,}    
}

info_dict2 = {
    'queryset': Student.objects.all(),
    'template_name': 'students/student_detail.html',
    'extra_context': {'student_detail': Student.objects.all}    
}

urlpatterns = patterns('',
    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': 'static'}),
    (r'^student/(?P<slug>[-\w]+)/$', 'django.views.generic.list_detail.object_detail', info_dict2), 
    (r'^students/(?P<slug>[-\w]+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
    (r'^$', 'django.views.generic.list_detail.object_list', info_dict),
    (r'^admin/', include(admin.site.urls)),
    (r'^hello/', hello),
)


I'm not sure what you mean when you say you would like to "use" the homepage model with the generic list view. If you simply want access to all instances of Homepage, you can add the following to info_dict in your urls.py:

info_dict = {
    'queryset' : School.objects.all(),
    'extra_context' : {'school_list' : School.objects.all(), 'homepage_list' : Homepage.objects.all()}
}

You can use a similar technique if you want to pass a specific instance of Homepage to the generic view:

...
'extra_context' : {'school_list' : School.objects.all(), 'homepage' : Homepage.objects.filter(id = 1).get()}

Finally, if you want something more complex (like a dynamic id to be used on the filter), you can always define a custom view, and then call object_list from within that view, like:

def my_view(request, dynamic_id):
    info_dict = {..., 'extra_context' : {..., 'homepage' : Homepage.objects.filter(id = dynamic_id).get()}}
    return django.views.generic.list_detail.object_list(**info_dict)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜