2013-09-06 2 views
1

잘 작동하는 listview를 만들었고 내가 원하는 것을 정확하게 제공합니다.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를 호출입니다 포함 된 URL을 해당하므로 같다

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

대단히 감사합니다! –

관련 문제