2016-10-22 16 views
2

Django 웹 사이트에서는 페이지 당 100 개의 특정 개체 목록을 보여주는 페이지 번호가 ListView입니다.Django에서 입력 허용 ListView

이 페이지에 텍스트 상자를 포함하고 사용자 입력을 처리하도록 허용하고 싶습니다. 그러나 장고,이 날 필요로 다음 중 하나를

내가) 사용하십시오 FormView (이 경우 내가 매김을 잃게), 또는

II) I 수동 매김하고 폼 처리를하는 기능 기반의 뷰를 작성합니다.

ListView을 방해하지 않고 이상적으로 달성하려는 세 번째 방법이 있습니까?

+0

목록과 양식을 쉽게 처리 할 수있는 간단한 기능 기반보기를 사용하지 않는 이유는 무엇입니까? – ettanany

+0

@ettanany : 예, (ii)의 비 -cbvs에 의해, 나는 함수 기반의 뷰를 의미했습니다. –

+0

알았습니다. 당신의 사건은이 하나 [ListView 및 하나의 템플릿 Django에서 CreateView] (http://stackoverflow.com/questions/19341568/listview-and-createview-in-one-template-django) 비슷합니다 생각합니다 – ettanany

답변

2

제 생각에는 각보기에는 하나의 목적이 있습니다. 단일 페이지에 여러 양식 요소를 사용할 수 없다는 의미는 아닙니다.

데이터 만 처리하는 일반보기를 만듭니다. 보기의 URL을 설정 한 다음 해당보기로 아약스를 호출합니다. .이 예 (단순 XHR 방법, 흐림, 변경 이벤트)

당신은뿐만 아니라 그것을 위해 자바 스크립트를 사용하고자하는 경우 쉽게 달성 할 수있다 : -

class FormElementProcess(View): 
    def post(self,request,*args,**kwargs): 
     #Do your processing and return httpresponse 

당신은 더 또한 위의 클래스를 정의 할 수 있습니다 양식 클래스도 사용되는 경우 양식 데이터 처리 및 반환을 위해 formviews를 사용하십시오.

이것은 내가 추측하는 방식입니다. 홈페이지에 수십 개의 양식이 있다고 가정 해 보겠습니다. -> 검색, 로그인, 등록 등과 같은 양식. 내 IndexView를 통해 모든 것을 처리하지는 않습니다. 애플리케이션 규모가 커지면 모든 작업이 복잡해집니다.

2) 페이지가 새로 고침되면 FormMixin을 사용하는 것이 좋습니다. 내가 FormListView

from django.http import Http404 
from django.utils.translation import ugettext as _ 
from django.views.generic.edit import FormMixin 
from django.views.generic.list import ListView 

class FormListView(FormMixin, ListView): 
    def get(self, request, *args, **kwargs): 
     # From ProcessFormMixin 
     form_class = self.get_form_class() 
     self.form = self.get_form(form_class) 

     # From BaseListView 
     self.object_list = self.get_queryset() 
     allow_empty = self.get_allow_empty() 
     if not allow_empty and len(self.object_list) == 0: 
      raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.") 
          % {'class_name': self.__class__.__name__}) 

     context = self.get_context_data(object_list=self.object_list, form=self.form) 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     return self.get(request, *args, **kwargs) 


class MyListView(FormListView): 
    form_class = MySearchForm 
    model = MyModel 
    # ... 

Detailed Code Explanation

당신은 당신의 처리를 할 수있는 더 포스트 방법을 수정하는 것을 찾을 좋은 구현이있다. 당신은 직접 폼 클래스를 사용할 수 있고, 처리 요청에 대한 매개 변수를 포함 할 수 있습니다.

1

다음과 같습니다 당신이 원하는 달성하기 위해 기능을 기반 뷰를 사용하는 예 :

연락처/models.py :

from django.db import models 
from django.utils.encoding import python_2_unicode_compatible 


@python_2_unicode_compatible 
class Contact(models.Model): 
    email = models.EmailField(unique=True) 
    first_name = models.CharField(max_length=40, blank=True) 
    last_name = models.CharField(max_length=40, blank=True) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return self.email 

연락처/forms.py :

from django import forms 


class UserForm(forms.Form): 
    search = forms.CharField(label='Search', max_length=100) 

contacts/views.py :

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from django.shortcuts import render, redirect 
from .models import Contact 
from .forms import UserForm 


def my_contacts(request): 
    form = UserForm() 
    if request.method == 'POST': 
     form = UserForm(request.POST) 
     if form.is_valid(): 
      # Do something with form data here 
      print(form.cleaned_data['search']) 
     redirect('my_contacts') 

    contacts_list = Contact.objects.all() 
    page = request.GET.get('page', 1) 

    paginator = Paginator(contacts_list, 10) 
    try: 
     contacts = paginator.page(page) 
    except PageNotAnInteger: 
     contacts = paginator.page(1) 
    except EmptyPage: 
     contacts = paginator.page(paginator.num_pages) 

    return render(request, 'contacts/contacts.html', {'contacts': contacts, 'form': form}) 

연락처/urls.py :

from django.conf.urls import patterns, url 

urlpatterns = patterns(
    'contacts.views', 
    url(r'^$', 'my_contacts', name='my_contacts'), 
) 

템플릿/연락처/Contacts.html이 :

{% extends 'base.html' %} 

{% block 'container' %} 
<div class="row"> 
    <div class="col-sm-12"> 
    <form action="" method="post"> 
     {% csrf_token %} 
     {{ form }} 
     <input type="submit" value="Submit" /> 
    </form> 
    </div> 
</div> 
<div class="row"> 
<div class="col-sm-12"> 
<table class="table table-bordered"> 
    <thead> 
    <tr> 
     <th>Email</th> 
     <th>First name</th> 
     <th>Last name</th> 
    </tr> 
    </thead> 
    <tbody> 
    {% for contact in contacts %} 
     <tr> 
     <td>{{ contact.email }}</td> 
     <td>{{ contact.first_name }}</td> 
     <td>{{ contact.last_name }}</td> 
     </tr> 
    {% endfor %} 
    </tbody> 
</table> 

{% if contacts.has_other_pages %} 
    <ul class="pagination"> 
    {% if contacts.has_previous %} 
     <li><a href="?page={{ contacts.previous_page_number }}">&laquo;</a></li> 
    {% else %} 
     <li class="disabled"><span>&laquo;</span></li> 
    {% endif %} 
    {% for i in contacts.paginator.page_range %} 
     {% if contacts.number == i %} 
     <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li> 
     {% else %} 
     <li><a href="?page={{ i }}">{{ i }}</a></li> 
     {% endif %} 
    {% endfor %} 
    {% if contacts.has_next %} 
     <li><a href="?page={{ contacts.next_page_number }}">&raquo;</a></li> 
    {% else %} 
     <li class="disabled"><span>&raquo;</span></li> 
    {% endif %} 
    </ul> 
{% endif %} 
</div> 
</div> 
{% endblock %} 

템플릿/base.html :

{% load static %} 

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
    <meta name="description" content=""> 
    <meta name="author" content=""> 
    <title>{% block 'title'%}{% endblock %}</title> 
    <!-- Bootstrap Core CSS --> 
    <link href={% static 'css/bootstrap.min.css' %} rel="stylesheet"> 
</head> 
<body> 
    <!-- Page Content --> 
    <div class="container" style="padding-top: 50px;"> 
     {% block 'container' %}{% endblock %} 
    </div> 
    <!-- /.container --> 

    <script src="{% static 'js/jquery.js' %}"></script> 
    <!-- Bootstrap Core JavaScript --> 
    <script src="{% static 'js/bootstrap.min.js' %}"></script> 
</body> 
</html>