我相信这很简单,只是无法找到解决方案。我有一个视图,它在服务器上做了一些工作,然后将用户传递回另一个视图,通常是原始的调用视图。
我现在正在渲染它的方式,网址没有重定向,即它是原始接收视图的网址。因此,在用户刷新的情况下,他们将再次运行该服务器代码。
class CountSomethingView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs):
# so some counting
view = MyDetailView.as_view()
return view(request, *args, **kwargs)
答案 0 :(得分:1)
我强烈建议不覆盖get
或post
方法。相反,覆盖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)
如果您要创建或更新模型,请考虑继承CreateView
或UpdateView
并指定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
操作是非常不好的做法(除非它只是填充缓存或修改非必要数据)。在大多数情况下,您应该考虑使用基于表单或基于模型的视图,例如上面建议的CreateView
或UpdateView
。