Django: как я могу сделать общий вид списка увидеть обычную модель? - PullRequest
0 голосов
/ 16 февраля 2010

Извините, если это глупый способ спросить это ... У меня есть общий вид списка для домашней страницы сайта, и я хотел бы использовать модель «домашней страницы» для информативного текста на той же странице ... это возможно? Спасибо за вашу помощь.

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': School.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),
)

1 Ответ

1 голос
/ 16 февраля 2010

Я не уверен, что вы имеете в виду, когда говорите, что хотели бы «использовать» модель домашней страницы с общим представлением списка. Если вы просто хотите получить доступ ко всем экземплярам Homepage, вы можете добавить следующее к info_dict в своем urls.py:

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

Вы можете использовать похожую технику, если хотите передать конкретный экземпляр Homepage в общий вид:

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

Наконец, если вы хотите, чтобы в фильтре использовалось что-то более сложное (например, динамический id), вы всегда можете определить пользовательское представление и затем вызвать object_list из этого представления, например:

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)
...