2013-10-13 2 views
2

사람들이 특정 종류의 객체를보고 생성 할 수있는 페이지를 디자인하고 있습니다 (객체는 모델 프로젝트의 인스턴스입니다).하나의 템플릿에 ListView와 CreateView Django

내가 이해하는 한,보기가 끔찍한 지저분한 코드 없이는 할 수 없으므로 한 템플릿을 사용하여 두 개의보기 (ProjectCreateView 및 ProjectListView)를 표시하는 방법을 이해하려고합니다. 지금

이 내가 함께 일하고 것입니다 :

views.py :

class ProjectCreateView(CreateView): 
    model = Project 
    template_name = "fileupload/project_list.html" 
    fields = ["name"] 

    def get_context_data(self, **kwargs): 
     context = super(ProjectCreateView, self).get_context_data(**kwargs) 
     return context 

class ProjectListView(ListView): 
    model = Project 

    def get_context_data(self, **kwargs): 
     context = super(ProjectListView, self).get_context_data(**kwargs) 
     return context 

class ProjectView(View): 
    model = Project 
    def get(self, request, *args, **kwargs): 
     view = ProjectListView.as_view() 
     return view(request, *args, **kwargs) 

    def post(self, request, *args, **kwargs): 
     view = ProjectCreateView.as_view() 
     return view(request, *args, **kwargs) 

urls.py

urlpatterns = patterns('', 
    url(r'^projects/$', ProjectView.as_view(), name="projects"), 
) 

models.py

형태는 버튼 후 "이름"필드를 보여줍니다이 구성

<form id="fileupload" method="post" action="." enctype="multipart/form-data"> 
    <div class="row fileupload-buttonbar"> 
     <div class="span7"> 
      <span class="btn btn-primary fileinput-button"> 
       <i class="icon-plus icon-white"></i> 
       <span>New Project</span> 
       <input type="submit" name="Create"> 
      </span> 
      <button type="button" class="btn btn-danger delete"> 
       <i class="icon-trash icon-white"></i> 
       <span>Delete Project</span> 
      </button> 
      <input type="checkbox" class="toggle"> 
     </div> 
     {{ form.as_p }} 
    </div> 
    <table class="table table-striped"><tbody class="files"></tbody></table> 
</form> 

그러나, 양식

class Project(models.Model): 
    name = models.CharField(max_length=200) 

    def get_absolute_url(self): 
     return reverse("projects") 

코드가 눌 렸는지, 그리고 이름을 입력 한 후 나는이 얻을 :

NoReverseMatch at /upload/projects/ 
Reverse for 'projects' with arguments '()' and keyword arguments '{}' not found. 

그 때문에 나는 이것을 수행하는 훨씬 쉬운 방법이 있다고 생각합니다. 나는 어떤 도움을 주셔서 감사합니다.

+0

새 개체를 만들려면 개체 목록, 모델 양식 및 게시를 구현하는 것을 구현할 수 있습니다.보기가 엉망이거나 냄새가 나지 않으면 서 수행 할 수 있습니다. 클래스 기반 뷰는 훌륭 할 때까지 훌륭합니다. – Brandon

+0

어떻게하면됩니까? 솔직히 하나의 템플릿에서 두 가지 작업을 수행 할 수있는 가장 깨끗한 솔루션을 찾고 있습니다. – Plasma

+0

예제 게시. – Brandon

답변

7

하나 개되지 않은 지저분한 CBV 싫어하는 믿을 전혀 복잡하지 않고 하나를 해달라고 만드는 쉬운 CreateView으로 목록 및 개체를 만들 수있는보기 ...

from django.shortcuts import render 
# model and form imports 

def list_and_create(request): 
    form = YourModelForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     form.save() 

    # notice this comes after saving the form to pick up new objects 
    objects = YourModel.objects.all() 
    return render(request, 'your-template.html', {'objects': objects, 'form': form}) 
+0

감사합니다! 이것은 아주 잘 작동합니다. – Plasma

+2

반갑습니다. 클래스 기반 뷰는 이론적으로 훌륭하지만 때로는 너무 복잡해집니다. – Brandon

8

을 기능 기반)

class ListAndCreate(CreateView): 
    model = YourModel 
    template_name = "your-template.html" 

    def get_context_data(self. **kwargs): 
     context = super(ListAndCreate, self).get_context_data(**kwargs) 
     context["objects"] = self.model.objects.all() 
     return context 

루프가 없으면 조건을 테스트하지 않아도 문제가 없음을 의미합니다.

+0

그게 간단합니다 - 나는 그것을 시도해야합니다! – stephendwolff

관련 문제