2013-07-29 66 views
0

我想訪問屬於特定課程的內容列表。我應該如何編寫我的觀點和網址來訪問它。我已經寫了意見和URL來取課程名單,但一些如何不能得到內容每門課程裏面在一對多關係模型中動態過濾對象

from django.contrib.auth.models import User 
from django.db import models 
import datetime 
from django.utils import timezone 
from django.template.defaultfilters import slugify 



class PostManager(models.Manager): 
    def live(self): 
     return self.model.objects.filter(published=True) 



class Course(models.Model): 
    course_name = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=200, blank=True, default='') 
    pub_date = models.DateTimeField('date published') 
    author = models.ForeignKey(User, related_name="courses") 
    published_course = models.BooleanField(default=True) 
    objects = PostManager() 

    class Meta: 
     ordering = ["-pub_date", "course_name"] 

    def __unicode__(self): 
     return self.course_name 

    def was_published_recently(self): 
     now = timezone.now() 
     return now - datetime.timedelta(days=1) <= self.pub_date < now 

    was_published_recently.admin_order_field = 'pub_date' 
    was_published_recently.boolean = True 
    was_published_recently.short_description = 'Published recently ?' 

    def save(self, *args, **kwargs): 
     if not self.slug: 
      self.slug = slugify(self.course_name) 
     super(Course, self).save(*args, **kwargs) 

    @models.permalink 
    def get_absolute_url(self): 
     return ("course:detail",(), {"slug": self.slug}) 


class Content(models.Model): 
    course = models.ForeignKey(Course) 
    topic_name = models.CharField(max_length=200) 
    slug_topic_name = models.SlugField(max_length=200, blank=True, default='') 
    desc = models.TextField() 
    published = models.BooleanField(default=True) 
    objects = PostManager() 

    def __unicode__(self): 
     return self.topic_name 

    def save(self, *args, **kwargs): 
     if not self.slug_topic_name: 
      self.slug_topic_name = slugify(self.topic_name) 
     super(Content, self).save(*args, **kwargs) 

    @models.permalink 
    def get_absolute_url(self): 
     return ("content:detail",(), {"slug_topic_name": self.slug_topic_name}) 

我的課程/ views.py

from django.views.generic import ListView, DetailView 

from .models import Course, Content 


class CourseListView(ListView): 
    model = Course 

    def get_queryset(self): 
     queryset = super(CourseListView, self).get_queryset() 
     return queryset.filter(published_course=True) 

class CourseContentListView(ListView): 

    context_object_name = 'content_list' 
    queryset = Content.objects.filter(course__course_name='HTML5') 
    template_name = 'content/content_list.html' 

我的課程/ urls.py

from django.conf.urls import patterns, url 

from . import views 

urlpatterns = patterns('', 
    url(r"^$", views.CourseListView.as_view(), name="list"), 
    url(r"^(?P<course_name>[\w-]+)/$", views.CourseContentListView.as_view(), name="list"), 
) 

項目/ urls.py

from django.conf.urls import patterns, include, url 
from django.contrib import admin 


from . import views 

admin.autodiscover() 

urlpatterns = patterns('', 
    # Examples: 
    # url(r'^$', 'kodeworms.views.home', name='home'), 
    # url(r'^kodeworms/', include('kodeworms.foo.urls')), 
    url(r"^$", views.HomepageView.as_view(), name="home"), 
    url(r"^course/", include("course.urls", namespace="course")), 
    url(r"^course/content", include("course.urls", namespace="content")), 

    url(r'^admin/', include(admin.site.urls)), 
) 

項目\課程\模板\課程\ course_list.html

{% extends "_layouts/base.html" %} 
{% load url from future %} 

{% block page_title %}Course List | {% endblock %} 

{% block page_content %} 
<h2>Course Grid</h2> 

<ul> 
    {% for course in course_list %} 
    <li><a href="{% url 'content:list' %}">{{ course.course_name }}</a></li> 
    {% empty %} 
    <li>Sorry, no courses yet. Check back soon! </li> 
    {% endfor %} 
    <p><a href="{% url 'home' %}">&larr; Home</a></p> 
</ul> 
{% endblock %} 

項目\課程\模板\內容\ content_list.html

{% extends "_layouts/base.html" %} 

{% block page_title %}{{ course.course_name }} | {% endblock %} 


{% block page_content %} 
<h2>{{ course.course_name }}</h2> 
{{ course.content|linebreaks }} 

<ul> 
    {% for content in object_list %} 
    <li>{{ content.topic_name }}</li> 
    {% empty %} 
    <li>Sorry, no content yet. Check back soon! </li> 
    {% endfor %} 
</ul> 

<p><a href="{% url 'course:list' %}">&larr; Course List</a></p> 
{% endblock %} 

在上面的代碼中,我有硬編碼課程名稱及其內容。我想爲任何任意的過程動態獲取它。另外我的pk = 1給出錯誤,pk = 8/9/10有值。可有人請幫助

+0

向我們展示了故障代碼。 – karthikr

+0

@karthikr對不起後期更新..緩慢的互聯網 – user2539745

回答

0

好吧,這是我的第一個Web項目和偏離輪詢後的第一個Django項目。所以這個soln。是爲那些像我一樣的新手/初學者進入編程/網絡開發的世界。

我的pk從pk = 8開始,所以我不知道如何訪問內容列表。但隨後用一些Django文檔閱讀和從這個Link得到的答案,我能夠找出問題並按照我的方式通過它。無論如何,這裏的修改代碼是

views.py - >早些時候,課程被硬編碼以訪問內容列表,我也試圖用主鍵動態訪問內容(我不成功)。所以現在我試圖用slu access訪問它,並取得了成功。

class CourseContentListView(ListView): 

    template_name = 'course/content_list.html' 

    def get_queryset(self): 
     self.course = get_object_or_404(Course, slug=self.kwargs['slug']) 
     return Content.objects.filter(course=self.course, published=True) 

我也看了一些更多關於Django模板從官方的文檔,並找出正確的方式來命名和訪問的URL,並更改了course_list.html訪問內容列表

course_list.html

<ul> 
    {% for course in course_list %} 
    <li><a href="{% url 'course:content_list' course.slug %}">{{ course.course_name }}</a></li> 
    {% empty %} 
    <li>Sorry, no courses yet. Check back soon! </li> 
    {% endfor %} 
    <p><a href="{% url 'home' %}">&larr; Home</a></p> 

</ul> 

更改urls.py正確指向相應的URL

我urls.py

urlpatterns = patterns('', 
    url(r"^$", views.CourseListView.as_view(), name="list"), 
    url(r"^(?P<slug>[\w-]+)/$", views.CourseContentListView.as_view(), name="content_list"), 
) 

我還在學習上面的代碼中可能會出現錯誤,或者更好/優雅的方式來做到這一點。但是,再次,這個代碼爲我工作。

0
a = Course.objects.get(pk=1) 
# List of contents for this course 
course_contents = a.content_set.all() 
0

您應該將CourseContentListView更改爲:

class CourseContentListView(ListView): 

    model = Content 
    context_object_name = 'content_list' 
    template_name = 'content/content_list.html' 

    def get_queryset(self): 
     queryset = super(CourseContentListView, self).get_queryset() 
     course_name = self.kwargs.get('course_name') 
     course = Course.objects.get(course_name=course_name) 
     queryset = queryset.filter(course=course) 
     return queryset 
+0

感謝您的輸入,但上面的代碼給錯誤'課程匹配查詢不存在。查找參數是{'course_name':無}' – user2539745