2016-05-23 20 views
0

私はeararningサイトを本の例に従って作成しようとしています。コースモジュールのフォームセットを表示するまで正しく機能しました。しかし、コースモジュールにコンテンツを追加する機能を追加すると、それはエラーを与える。エラーは以下のとおりです。コンテンツフォームはDjangoのeLearningサイトに表示されていません

ここ
from django.core.urlresolvers import reverse_lazy 
from django.views.generic.list import ListView 
from django.views.generic.edit import CreateView, UpdateView, DeleteView 
from .models import Course 
from django.shortcuts import redirect, get_object_or_404 
from django.views.generic.base import TemplateResponseMixin, View 
from .forms import ModuleFormSet 
from django.forms.models import modelform_factory 
from django.apps import apps 
from .models import Module, Content 

from braces.views import LoginRequiredMixin,PermissionRequiredMixin 

class OwnerMixin(object): 
    def get_queryset(self): 
     qs = super(OwnerMixin, self).get_queryset() 
     return qs.filter(owner=self.request.user) 

class OwnerEditMixin(object): 
    def form_valid(self, form): 
     form.instance.owner = self.request.user 
     return super(OwnerEditMixin, self).form_valid(form) 

class OwnerCourseMixin(OwnerMixin, LoginRequiredMixin): 
    model = Course 
    fields = ['subject', 'title', 'slug', 'overview'] 
    success_url = reverse_lazy('manage_course_list') 

class OwnerCourseEditMixin(OwnerCourseMixin, OwnerEditMixin): 
    fields = ['subject', 'title', 'slug', 'overview'] 
    success_url = reverse_lazy('manage_course_list') 
    template_name = 'courses/manage/course/form.html' 

class ManageCourseListView(OwnerCourseMixin, ListView): 
    template_name = 'courses/manage/course/list.html' 

class CourseCreateView(PermissionRequiredMixin, 
         OwnerCourseEditMixin, 
         CreateView): 
    permission_required = 'courses.add_course' 

class CourseUpdateView(PermissionRequiredMixin, 
         OwnerCourseEditMixin, 
         UpdateView): 
    template_name = 'courses/manage/course/form.html' 
    permission_required = 'courses.change_course' 

class CourseDeleteView(PermissionRequiredMixin, 
         OwnerCourseMixin, DeleteView): 
    template_name = 'courses/manage/course/delete.html' 
    success_url = reverse_lazy('manage_course_list') 
    permission_required = 'courses.change_course' 

class CourseModuleUpdateView(TemplateResponseMixin, View): 
    template_name = 'courses/manage/module/formset.html' 
    course = None 

    def get_formset(self, data=None): 
     return ModuleFormSet(instance=self.course, 
           data=data) 

    def dispatch(self, request, pk): 
     self.course = get_object_or_404(Course, 
             id=pk, 
             owner=request.user) 
     return super(CourseModuleUpdateView, 
        self).dispatch(request, pk) 

    def get(self, request, *args, **kwargs): 
     formset = self.get_formset() 
     return self.render_to_response({'course': self.course, 
             'formset': formset}) 

    def post(self, request, *args, **kwargs): 
     formset = self.get_formset(data=request.POST) 
     if formset.is_valid(): 
      formset.save() 
      return redirect('manage_course_list') 
     return self.render_to_response({'course': self.course, 
            'formset': formset}) 

class ContentCreateUpdateView(TemplateResponseMixin, View): 
    module = None 
    model = None 
    obj = None 
    template_name = 'courses/manage/content/form.html' 

    def get_model(self, model_name): 
     if model_name in ['text', 'video', 'image', 'file']: 
      return apps.get_model(app_label='courses', 
           model_name=model_name) 
     return None 

    def get_form(self, model, *args, **kwargs): 
     Form = modelform_factory(model, exclude=['owner', 
               'order', 
               'created', 
               'updated']) 
     return Form(*args, **kwargs) 

    def dispatch(self, request, module_id, model_name, id=None): 
     self.module = get_object_or_404(Module, 
             id=module_id, 
             course__owner=request.user) 
     self.model = self.get_model(model_name) 
     if id: 
      self.obj = get_object_or_404(self.model, 
             id=id, 
             owner=request.user) 
     return super(ContentCreateUpdateView, 
        self).dispatch(request, module_id, model_name, id) 

    def get(self, request, module_id, model_name, id=None): 
     form = self.get_form(self.model, instance=self.obj) 
     return self.render_to_response({'form': form, 
             'object': self.obj}) 

    def post(self, request, module_id, model_name, id=None): 
     form = self.get_form(self.model, 
          instance=self.obj, 
          data=request.POST, 
          files=request.FILES) 
     if form.is_valid(): 
      obj = form.save(commit=False) 
      obj.owner = request.user 
      obj.save() 
      if not id: 
       # new content 
       Content.objects.create(module=self.module, 
             item=obj) 
      return redirect('module_content_list', self.module.id) 
     return self.render_to_response({'form': form, 
             'object': self.obj}) 

は私のコース/ urls.pyファイルである:ここで

Page not found (404) 
Request Method: GET 
Request URL: http://127.0.0.1:8000/course/module/6/content/image/create/ 
Raised by: courses.views.ContentCreateUpdateView 

は、私のviews.pyファイルである。ここ
from django.conf.urls import url 
from . import views 

urlpatterns = [ 
    url(r'^mine/$', 
     views.ManageCourseListView.as_view(), 
     name='manage_course_list'), 
    url(r'^create/$', 
     views.CourseCreateView.as_view(), 
     name='course_create'), 
    url(r'^(?P<pk>\d+)/edit/$', 
     views.CourseUpdateView.as_view(), 
     name='course_edit'), 
    url(r'^(?P<pk>\d+)/delete/$', 
     views.CourseDeleteView.as_view(), 
     name='course_delete'), 
    url(r'^(?P<pk>\d+)/module/$', 
     views.CourseModuleUpdateView.as_view(), 
     name='course_module_update'), 
    url(r'^module/(?P<module_id>\d+)/content/(?P<model_name>\w+)/create/$', 
     views.ContentCreateUpdateView.as_view(), 
     name = 'module_content_create'), 
    url(r'^module/(?P<module_id>\d+)/content/(?P<model_name>\w+)/(?P<id>\d+)/$', 
     views.ContentCreateUpdateView.as_view(), 
     name='module_content_update'), 
] 

は私のコース/管理/ content/form.htmlテンプレート:

{% extends "base.html" %} 

{% block title %} 
    {% if object %} 
     Edit content "{{ object.title }}" 
    {% else %} 
     Add a new content 
    {% endif %} 
{% endblock %} 

{% block content %} 
    <h1> 
     {% if object %} 
      Edit content "{{ object.title }}" 
     {% else %} 
      Add a new content 
     {% endif %} 
    </h1> 

    <div class="module"> 
     <h2>Course info</h2> 
     <form action="" method="post" enctype="multipart/form-data"> 
      {{ form.as_p }} 
      {% csrf_token %} 
      <p><input type="submit" value="Save content"></p> 
     </form> 
    </div> 
{% endblock %} 

これは私ですプロジェクトレイアウト: enter image description here

誰でも私になぜが404エラーを出すのか教えてもらえますか?私はURLのモジュールidを変更しましたが運はありません。 dispatch方法で

+0

http://127.0.0.1:8000/module/1/content/image/create/に電話する必要はありませんか?もちろん... –

+1

エリアス、http://127.0.0.1:8000/course/module/1/content/image/create/ now worked。理由はログインの問題でした。 – ohid

+0

フィードバックをお寄せいただきありがとうございます。 –

答えて

0

、あなたが持っている:

self.module = get_object_or_404(Module, 
           id=module_id, 
           course__owner=request.user) 

を、これは(URLから)ID 6とモジュールは、現在のユーザーに属していないことを意味している場合、その後、404を発生させた場合。

モジュールのコースのオーナーとしてログインしてもう一度やり直すか、/course/module/6/content/image/create/のIDを表示権限に変更することができます。

関連する問題