2011-04-09 1 views
7

내가하려고하는 것은 Django의 기능적보기를위한 것입니다. 문서보기에서 템플릿보기 및 목록보기에 대한 예제를 보여 주었으므로 여기서는 도움이됩니다. 모델 기반의 일반보기에서는 거의 찾지 못했습니다. 문서에서 예제가 누락 되었습니까?모델에 대해 일반 클래스 기반 생성보기를 만들려면 어떻게해야합니까?

캘린더의 항목을 나타내는 모델이 있습니다. 엔트리를 소유 한 다른 객체 (사용자가 아닌)에 대한 외래 키가 있습니다. 내가하고 싶은 일은 단순히 엔트리를 작성하여 엔트리의 외래 키가 올바르게 설정되었는지 확인한 다음 사용자를 적절한 달력 페이지로 리턴하는 것입니다.

그러나 클래스 기반 제네릭 뷰가 URL 인수를받는 방법을 알지 못하고 success_url을 설정하는 방법이 명확하지 않으므로 원래 생성 URL에 전달 된 ID를 다시 사용합니다. 다시 한번 귀하의 도움에 감사드립니다.

내가 부탁 해요 무엇 본질적이며, 다음의 클래스 기반의 일반적인보기 상응하는 무엇 :

def create_course_entry(request, class_id): 
'''Creates a general calendar entry.''' 
if request.method == 'POST': 
    form = CourseEntryForm(request.POST) 
    if form.is_valid(): 
     new_entry = form.save(commit=False) 
     new_entry.course = Class.objects.get(pk=class_id) 
     new_entry.full_clean() 
     new_entry.save() 
     return HttpResponseRedirect('/class/%s/calendar/' % class_id) 
else: 
    form = CourseEntryForm() 

return render_to_response('classes/course_entry_create.html', 
     { 'class_id': class_id, 'form': form, }, 
     context_instance=RequestContext(request)) 

답변

22

당신은 edit.CreateView 일반적인 뷰를 서브 클래 싱 할 수는의 dispatch()의 클래스/과정을 설정 방법, 그리고 form_valid() 방법을 재정 의하여이 저장 :

from django.http import HttpResponseRedirect 
from django.shortcuts import get_object_or_404 
from django.views.generic.edit import CreateView 


class CourseEntryCreateView(CreateView): 
    form_class = CourseEntryForm 
    model = CourseEntry 

    def dispatch(self, *args, **kwargs): 
     self.course = get_object_or_404(Class, pk=kwargs['class_id']) 
     return super(CourseEntryCreateView, self).dispatch(*args, **kwargs) 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.course = self.course 
     self.object.save() 
     return HttpResponseRedirect(self.get_success_url()) 

당신이 CourseEntryFormModelForm을 사용자 정의하지 않는 경우에, 당신은 form_class 특성을 남길 수 있습니다.

불행히도 form_valid() 메서드에서 super()으로 전화를 걸 수 없습니다. 이는 작성된 방식으로 인해 개체가 다시 저장된다는 의미입니다. 당신이 클래스 (? 과정) 필요한 경우 인스턴스를 템플릿 맥락에서

, 당신은 get_context_data() 방법이를 추가 할 수 있습니다

def get_context_data(self, *args, **kwargs): 
     context_data = super(CourseEntryCreateView, self).get_context_data(
      *args, **kwargs) 
     context_data.update({'course': self.course}) 
     return context_data 
+2

'form_valid()'에 수동으로 객체를 저장하는 대신'form.instance'를 사용하여'course'를 설정하기 만하면됩니다. 그래서'super()'를 다시 호출 할 수도 있습니다. – stschindler

6

대안을 매트 오스틴의 대답에 get_form 메소드를 오버라이드 (override) 할 수 있습니다 :

from django.shortcuts import get_object_or_404 
from django.views.generic import CreateView 

class CourseEntryCreateView(CreateView): 
    form_class = CourseEntryForm 
    model = CourseEntry 

    def get_form(self, form_class): 
     form = super(CustomCreateView, self).get_form(form_class) 
     course = get_object_or_404(Class, pk=self.kwargs['class_id']) 
     form.instance.course = course 
     return form 

이 방법은 .course는 맥락에서 CourseEntry 인스턴스이며, 양식 POST에 저장 될 때 생성 된 인스턴스.