2013-09-06 5 views
1

Я построил список, который отлично работает и дает мне именно то, что я хочу.Возможно ли иметь форму в шаблоне ListView?

В шаблоне этого ListView я объявила форму, которая указывает на CreateView. форма, как это так,

{% if user.is_authenticated %} 
<form action="{% url 'post_wall' %}" method="POST"> 
    {% csrf_token %} 
    <input type='text' name='body' /> 
    <input type='hidden' name='from_user' value='{{ user.id }}' /> 
    <input type='hidden' name='to_user' value='{{ to_user }}' /> 
    <input type='submit' value='POST'/> 
</form> 
{% endif %} 

post_wall URL соответствует

url(r'accounts/post_wall', WallCreate.as_view(), name='post_wall'), 

Адрес страницы, которая содержит форма

url(r'accounts/wall/(?P<slug>\w+)/$', WallList.as_view(), name='wall'), 

Это вызывает CreateView,

class WallCreate(CreateView): 
    model = WallPost 

    def get_success_url(self): 
     url = reverse('wall', kwargs={'slug': request.POST.to_user}) 
     return HttpResponseRedirect(url) 

Это дает мне

TemplateDoesNotExist at /accounts/post_wall 
users/wallpost_form.html 

Не должно ли оно работать должным образом, поскольку сообщение отправляется в CreateView? Или я что-то не понял о CBV?

ответ

5

Да, но все формы процесса должны быть сделаны самим ListView. Это просто, учитывая, что вы можете наследовать поведение от ModelFormMixin. Вам понадобится только один URL-адрес (в виде списка). Шаблон будет выглядеть следующим образом:

{% if user.is_authenticated %} 
<form action="" method="POST"> 
    {% csrf_token %} 
    {{ form }} 
    <input type='submit' value='POST'/> 
</form> 
{% endif %} 

И ваш взгляд:

from django.views.generic.list import ListView 
from django.views.generic.edit import ModelFormMixin 

class ListWithForm(ListView, ModelFormMixin): 
    model = MyModel 
    form_class = MyModelForm 

    def get(self, request, *args, **kwargs): 
     self.object = None 
     self.form = self.get_form(self.form_class) 
     # Explicitly states what get to call: 
     return ListView.get(self, request, *args, **kwargs) 

    def post(self, request, *args, **kwargs): 
     # When the form is submitted, it will enter here 
     self.object = None 
     self.form = self.get_form(self.form_class) 

     if self.form.is_valid(): 
      self.object = self.form.save() 
      # Here ou may consider creating a new instance of form_class(), 
      # so that the form will come clean. 

     # Whether the form validates or not, the view will be rendered by get() 
     return self.get(request, *args, **kwargs) 

    def get_context_data(self, *args, **kwargs): 
     # Just include the form 
     context = super(ListWithForm, self).get_context_data(*args, **kwargs) 
     context['form'] = self.form 
     return context 
+0

Это работает. Если бы я должен был фильтровать свой контент для представления списка, я должен был бы сделать это, вернувшись на get_queryset правильно? –

+0

Да, вы можете настроить его точно так же, как и обычный «ListView». –

+0

Большое спасибо, сэр! –

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