Python 使用CBV'重定向;他在Django
我相信这是一个简单的问题,只是无法找到解决方案。我有一个视图,它在服务器上做了一些工作,然后将用户传递回另一个视图,通常是原始调用视图 我现在呈现它的方式是,url没有重定向,即它是原始接收视图的url。因此,在用户刷新的情况下,他们将再次运行该服务器代码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
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 或RedirectView
继承并重写GET
方法(还可以选择指定permanent=False
):
请注意,让
get
操作产生副作用是非常糟糕的做法(除非它只是填充缓存或修改非必要数据)。在大多数情况下,您应该考虑使用基于表单或模型表单的视图,如<>代码> CurATEVIEW 或调度
。因此,要扩展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
后面永远不会有重定向。您需要重定向还是使用了错误的术语?通常HTTPget
之后永远不会有重定向。为什么强烈建议不要重写get和post方法?从技术上讲,您可以重写它们,但这样一来,您就失去了默认实现所包含的所有内部方法的好处。例如,DetailView
类知道如何实例化模型实例,并且get
和post
已经知道如何在内部使用这些知识(查看[方法流程图][以了解视图内部到底发生了什么)。因此,问题是您到底要修改什么行为,然后只修改提供该行为的方法。当然,您的用例可能不适合预定义的视图,您需要从头开始实现get
或post
,但是您应该扩展一个基本视图,如视图代码>。为什么强烈建议不要重写get和post方法?从技术上讲,您可以重写它们,但这样会失去默认实现所包含的所有内部方法的好处。例如,DetailView
类知道如何实例化模型实例,以及get
和post
已经知道如何在内部使用这些知识(查看[方法流程图][以了解视图内部到底发生了什么)。因此,问题是您到底要修改什么行为,然后只修改提供该行为的方法。当然,您的用例可能不适合预定义的视图,您需要实现get
或post