2016-10-22 15 views
2

DjangoのWebサイトでは、ページ番号100の特定のオブジェクトの一覧を示すページ番号ListViewがあります。Djangoの入力を受け付けるListView

このページにテキストボックスを含めて、ユーザーの入力を受け入れることができます。しかし、ジャンゴでは、これは私を必要とするのいずれか:

i)が使用FormView(この場合、私は改ページを失う)、または

II)私は手動で改ページとフォーム処理を扱う関数ベースのビューを作成します。

ListViewを中断することなく、私がやろうとしていることを達成するための第3の方法はありますか?次のように

+0

リストとフォームを簡単に処理できる簡単な関数ベースのビューを使用してみませんか? – ettanany

+0

@ettanany:はい、(ii)の非cbvsによって、私は関数ベースのビューを意味しました –

+0

私はそれを得ました。私はあなたのケースは、この1つ[ListViewと1つのテンプレートDjangoでCreateView](http://stackoverflow.com/questions/19341568/listview-and-createview-in-one-template-django)に似ていると思う – ettanany

答えて

2

私の意見では、それぞれのビューには1つの目的があるはずです。一つのページに複数のフォーム要素を持つことができないというわけではありません。あなたはそれを行うことができます

データのみを処理する通常のビューを作成します。ビューのURLを設定し、そのビューにajax呼び出しを行います。 。これは、ex(シンプルXHR方法、ぼかし、変化イベント)

あなたにも、そのためにはJavaScriptを使用して喜んでいる場合は、容易に達成することができます: -

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> 
関連する問題