在Django中使用CBV重定向

时间:2013-09-02 18:45:42

标签: python django redirect django-class-based-views

我相信这很简单,只是无法找到解决方案。我有一个视图,它在服务器上做了一些工作,然后将用户传递回另一个视图,通常是原始的调用视图。

我现在正在渲染它的方式,网址没有重定向,即它是原始接收视图的网址。因此,在用户刷新的情况下,他们将再次运行该服务器代码。

class CountSomethingView(LoginRequiredMixin, View):
    def get(self, request, *args, **kwargs):
        # so some counting
        view = MyDetailView.as_view()
        return view(request, *args, **kwargs)

4 个答案:

答案 0 :(得分:1)

我强烈建议覆盖getpost方法。相反,覆盖dispatch。所以,要扩展Platinum Azure的答案:

class CountSomethingView(LoginRequiredMixin, RedirectView):
    permanent = False

    def get_redirect_url(self, **kwargs):
        url = you_can_define_the_url_however_you_want(**kwargs)
        return url

    def dispatch(self, request, *args, **kwargs):
        # do something
        return super(CountSomethingView, self).dispatch(request, *args, **kwargs)

答案 1 :(得分:0)

当用户执行操作并且我需要将其重定向到同一页面时,首先我使用templateView显示简单的“谢谢”(例如)然后提供一个链接以返回上一页一个简单的{% url %}

例如:

from django.views.generic import CreateView, TemplateView
from django.http import HttpResponseRedirect

class UserServiceCreateView(CreateView):
    form_class = UserServiceForm
    template_name = "services/add_service.html"

    def form_valid(self, form):
    [...]

    return HttpResponseRedirect('/service/add/thanks/')

class UserServiceAddedTemplateView(TemplateView):
     template_name = "services/thanks_service.html"

    def get_context_data(self, **kw):
        context = super(UserServiceAddedTemplateView, self).\
            get_context_data(**kw)
        context['sentance'] = 'Your service has been successfully created'
        return context

在模板thanks_service.html中,我使用{% url %}返回预期的页面

希望这可以提供帮助

答案 2 :(得分:0)

在基于Django Class的视图中执行重定向非常简单。

只需执行return redirect('your url goes here')

但是,我相信这不是你想要做的。 我看到你正在使用get()。 通常,在谈到HTTP时,GET请求很少会出现重定向。 POST请求通常后跟重定向,因为当用户向后退时,您不希望再次提交相同的数据。

那你想做什么? 我认为你想做的是:

def get(self, request, *args, **kwargs):
   return render_to_response('your template', data)

甚至更好

def get(self, request, *args, **kwargs):
    return render(request, self.template_name, data)

答案 3 :(得分:0)

如果您要创建或更新模型,请考虑继承CreateViewUpdateView并指定success_url

如果你真的正在重做HTTP GET操作的重定向,你可以继承RedirectView并覆盖get方法(也可以指定permanent = False):

class CountSomethingView(LoginRequiredMixin, RedirectView):
    permanent = False

    def get(self, request, *args, **kwargs):
        # do something
        return super(CountSomethingView, self).get(self, request, *args, **kwargs)

请注意,使用副作用进行get操作是非常不好的做法(除非它只是填充缓存或修改非必要数据)。在大多数情况下,您应该考虑使用基于表单或基于模型的视图,例如上面建议的CreateViewUpdateView