Django 类视图 (FormView, TemplateView, DetailView) 与 urls
我想要一个表单,用户输入后可以把这个输入添加到网址中,使用CBVs(类视图)。比如说,如果我输入5,它应该进行一些处理(查询或自定义函数),然后重定向到/order/5/details/,显示订单号为5的详细信息。在/order/5/details/页面上,如果我点击安排,它应该跳转到/order/5/schedule,依此类推。
所以,简单来说,我的问题是 - 我该如何使用CBVs来实现这个功能?CBVs是否只和对象有关?
这是我目前的进展:
#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 个回答
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'
),
)
0
我看不出这和基于类的视图有什么特别的关系。
无论你的代码在哪里,你都可以使用 reverse
函数来计算一个网址。所以你可以这样做:
redirect_url = reverse('tasks-details', kwargs={'order_id': 5})
然后你可以从任何地方使用 return redirect(redirect_url)
来进行重定向。