2014-07-10 2 views
0

입력을 받아서 URL에 CBV를 사용하여 추가하는 양식이 필요합니다. 예를 들어, 5를 입력하면 일부 처리 (쿼리/사용자 정의 함수)를 수행하고/order/5/details/order number 5의 세부 정보를 표시해야합니다. On/order/5/details/일정에 맞으면/order/5/schedule 등으로 라우트해야합니다.Django 클래스 기반 뷰 (FormView, TemplateView, DetailView) 및 URL

기본적으로 제 질문은 - CBV를 사용하여 어떻게 달성 할 수 있습니까? CBV는 물체에만 연결되어 있습니까? 나는이 특별히 클래스 기반의 전망과 관련이있다 무엇을 볼 수 없습니다

#order/forms.py 

from django import forms 
class OrderForm(forms.Form): 
    order_id = forms.IntegerField() 


#order/views.py 

class OrderFormView(FormView): 
# form to enter Id 
form_class = OrderForm 
success_url = '/order/detail/' 
template_name = 'order/order_form.html' 

@method_decorator(login_required(login_url='/order/login/')) 
def dispatch(self, request, *args, **kwargs): 
    return super(OrderFormView, self).dispatch(request, *args, **kwargs) 

def form_valid(self, form): 
    order_id = self.request.POST['order_id'] # this or get method? 
    return HttpResponseRedirect(self.get_success_url(), {'order_id': order_id}) 

def form_invalid(self, form): 
    return self.render_to_response(self.get_context_data(form=form)) 

def get_context_data(self, **kwargs): 
    context = super(OrderFormView, self).get_context_data(**kwargs) 
    context['name'] = self.request.user.username 
    return context 


class OrderDetailView(TemplateView): 
    template_name = 'order/order_detail.html' 

    @method_decorator(login_required(login_url='/order/login')) 
    def dispatch(self, request, *args, **kwargs): 
    return super(OrderDetailView, self).dispatch(request, *args, **kwargs) 

    def get(self, request, *args, **kwargs): 
     context = self.get_context_data(**kwargs) 
     return self.render_to_response(context) 

    def get_context_data(self, **kwargs): 
     context = super(OrderDetailView, self).get_context_data(**kwargs) 
     context['name'] = self.request.user.username 
     return context 

#urls 

url(r'^order/$', OrderFormView.as_view(), name='order-form'), 
url(r'^order/(?P<order_id>\d+)/orderdetails/$', tasks.views.TaskDetailView.as_view(), name='tasks-detail'), 

답변

0

: 여기

는 내가 지금까지 가지고있는 것입니다.

코드가 어디에 있든 reverse 함수를 사용하여 URL을 계산합니다.

redirect_url = reverse('tasks-details', kwargs={'order_id': 5}) 

을 당신은 당신이 리디렉션을 수행하여 원하는 목적지에서 return redirect(redirect_url)을 수행 할 수 있습니다 그래서 당신은 할 수 있습니다.

0

@Daniel의 대답을 사용하면 get_success_url 메서드를 무시하고 원하는 변수를 원하는보기로 전달할 수 있습니다. 그런 다음 적절한 페이지 (세부 정보 또는 일정)를 반환 할 수 있습니다.

# code snippet 
# views.py 
def get_success_url(self): 
    order_num = self.kwargs['order_num'] 
    page_name = self.kwargs['page_name'] 
    return HttpResponseRedirect(reverse('tasks-details', args=(order_num, page_name,))) 

# urls.py 
urlpatterns = patterns('', 
     url(
      regex=r'^order/(?P<order_num>[\d]+)/(?P<page_name>[\w]+)$', 
      view= login_required(OrderView.as_view()), 
      name='tasks-details' 
     ), 
) 
관련 문제