Представления на основе классов Django (FormView, TemplateView, DetailView) и URL

Я хотел бы иметь форму, которая принимает входные данные и добавляет его к URL-адресам, используя CBV. Например, если я ввожу 5, он должен выполнить некоторую обработку (запрос / пользовательскую функцию) и перенаправить в / order / 5 / details /, показывая детали номера заказа 5. В / order / 5 / details /, если я нажму на график, он следует направить в / order / 5 / schedule и так далее.

Итак, в основном, мои вопросы: как бы я достиг этого, используя 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'),

2 ответа

Используя ответ @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'
         ),
)

Я не могу понять, как это связано с представлениями на основе классов.

Где бы ни находился ваш код, вы рассчитываете URL, используя reverse функция. Так что вы можете сделать:

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

и вы можете сделать return redirect(redirect_url) откуда вы хотите сделать перенаправление.

Другие вопросы по тегам