Python 使用CBV'重定向;他在Django

Python 使用CBV'重定向;他在Django,python,django,redirect,django-class-based-views,Python,Django,Redirect,Django Class Based Views,我相信这是一个简单的问题,只是无法找到解决方案。我有一个视图,它在服务器上做了一些工作,然后将用户传递回另一个视图,通常是原始调用视图 我现在呈现它的方式是,url没有重定向,即它是原始接收视图的url。因此,在用户刷新的情况下,他们将再次运行该服务器代码 class CountSomethingView(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): # so some counti

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

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

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

当用户执行某个操作时,我需要将其重定向到同一页面,首先我使用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
在模板Thank_service.html中,我使用
{%url%}
返回预期页面


希望这可以帮助

当用户执行某个操作时,我需要将他重定向到同一页面,首先我使用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
在模板Thank_service.html中,我使用
{%url%}
返回预期页面


希望这有助于

在基于Django类的视图中执行重定向是很容易的

只需执行一个
返回重定向('您的url在这里')

然而,我相信这不是你想做的。 我看到您正在使用
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)

在基于Django类的视图中执行重定向很容易

只需执行一个
返回重定向('您的url在这里')

然而,我相信这不是你想做的。 我看到您正在使用
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)

如果您正在创建或更新模型,请考虑从<代码> CREATEVIEW 或<代码> UPDATEVIEW 继承,并指定<代码> RealthURL< /COD>

如果您确实在执行HTTP GET操作的重定向,则可以从
RedirectView
继承并重写
GET
方法(还可以选择指定
permanent=False
):


请注意,让
get
操作产生副作用是非常糟糕的做法(除非它只是填充缓存或修改非必要数据)。在大多数情况下,您应该考虑使用基于表单或模型表单的视图,如<代码> CREATEVIEW 或 UPDATEVIEW 如上所述。

< P>如果您正在创建或更新模型,请考虑从<代码> CurATEVIEW 或<代码> UPDATEVIEW 继承,并指定<代码> RealthURL < /P> 如果您确实在执行HTTP GET操作的重定向,则可以从
RedirectView
继承并重写
GET
方法(还可以选择指定
permanent=False
):


请注意,让
get
操作产生副作用是非常糟糕的做法(除非它只是填充缓存或修改非必要数据)。在大多数情况下,您应该考虑使用基于表单或模型表单的视图,如<>代码> CurATEVIEW 或 UPDATEVIEW 如上所述。

< P>我强烈推荐<强> > < >强> >重写<代码>获取<代码> >或<代码> POST < /Cord>方法。而是覆盖
调度
。因此,要扩展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)

我强烈建议not重写
get
post
方法。而是覆盖
调度
。因此,要扩展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)

您需要重定向还是使用了错误的术语?通常HTTP
get
后面永远不会有重定向。您需要重定向还是使用了错误的术语?通常HTTP
get
之后永远不会有重定向。为什么强烈建议不要重写get和post方法?从技术上讲,您可以重写它们,但这样一来,您就失去了默认实现所包含的所有内部方法的好处。例如,
DetailView
类知道如何实例化模型实例,并且
get
post
已经知道如何在内部使用这些知识(查看[方法流程图][以了解视图内部到底发生了什么)。因此,问题是您到底要修改什么行为,然后只修改提供该行为的方法。当然,您的用例可能不适合预定义的视图,您需要从头开始实现
get
post
,但是您应该扩展一个基本视图,如
视图。为什么强烈建议不要重写get和post方法?从技术上讲,您可以重写它们,但这样会失去默认实现所包含的所有内部方法的好处。例如,
DetailView
类知道如何实例化模型实例,以及
get
post
已经知道如何在内部使用这些知识(查看[方法流程图][以了解视图内部到底发生了什么)。因此,问题是您到底要修改什么行为,然后只修改提供该行为的方法。当然,您的用例可能不适合预定义的视图,您需要实现
get
post