2013-10-13 5 views
2

Я разрабатываю страницу, в которой люди могут просматривать и создавать объекты определенного вида (объекты являются экземплярами модели Project).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

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

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

код для формы

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

Однако с этой конфигурацией формы показывает только поле «имя» после того, как кнопка была нажата, и после ввода в имени я получаю это:

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

Из-за этого я предполагаю, что есть намного более простой способ реализовать это, чем то, что я делаю. Буду признателен за любую помощь.

+0

Вы можете реализовать показ списка объектов, формы модели и обработки сообщения для создания новых объектов в одном представлении без его уродливости, вонючего или иного. Взгляды на основе классов велики, пока они не станут. – Brandon

+0

Как я могу это сделать? Я честно просто ищу чистое решение, которое позволит мне сделать две вещи на одном шаблоне. – Plasma

+0

Опубликовать пример для вас. – Brandon

ответ

7

Один не-грязный функции на основе представления для вывода списка и создавать объекты ...

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

Добро пожаловать. Классические взгляды велики в теории, но иногда они просто усложняют вещи, imo. – Brandon

8

с CreateView его легко сделать один без любой сложности вообще не верят ненавистник ОЦК;)

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

Смежные вопросы