基于视图 Class - 调用了 success_url 方法但重定向似乎不起作用
Based View Class - called success_url method but redirect doesn't seem to work
我正在使用基于视图 class 更新我的应用程序中名为 article 的文章。
我正在实现它,就像 UpdateView 的工作方式一样,但是我似乎无法在验证表单后将其重定向。我调用了 success_url 方法来重定向到详细视图,但它不起作用。我错过了什么吗?
我在模型中设置get_absolute_url,
#models.py
class Article(models.Model):
def get_absolute_url(self):
return reverse('articles:article-detail', kwargs={"id": self.id})
在网址中
#urls.py
app_name = 'articles'
urlpatterns = [
path('<int:id>/edit/', ArticleUpdateView.as_view(), name='article-edit'),
path('<int:id>/', ArticleDetailView.as_view(), name='article-detail'),
]
以及浏览量:
#views.py
class ArticleUpdateView(View):
template_name = 'articles/article_edit.html'
def get_success_url(self):
id = self.kwargs.get('id')
return reverse('articles:article-detail', kwargs={'id': id})
def get_object(self):
id = self.kwargs.get('id')
obj = None
if id is not None:
obj = get_object_or_404(Article, id=id)
return obj
def get(self, request, id=None, *args, **kwargs):
context = {}
obj = self.get_object()
if obj is not None:
form = ArticleModelForm(instance=obj)
context['article'] = obj
context['form'] = form
return render(request, self.template_name, context)
def post(self, request, id=None, *args, **kwargs):
context = {}
obj = self.get_object()
if obj is not None:
form = ArticleModelForm(request.POST, instance=obj)
if form.is_valid():
form.save()
context['article'] = obj
context['form'] = form
return render(request, self.template_name, context)
我尝试在 UpdateView class 上使用它,重定向似乎工作正常,我想在基于视图 class.
上使用它
django 基础视图 class 不会自动调用 get_success_url()
之类的东西,这是添加到基于 class 的通用视图 [=11] 功能中的东西=] 从它继承的另一个 class。如果您想在基础视图中重定向,那么您需要实际进行重定向调用。
在您的 views.py 文件中,您可以导入 from django.http import HttpResponseRedirect
,然后在您视图中的 if form.isvalid():
语句中,您可以添加行 return HttpResponseRedirect(self.get_success_url())
。仅仅调用 get_success_url()
本身对你定义它的方式没有任何作用,因为 reverse()
快捷方式只是根据你传递给函数的名称和参数生成 url。
检查这个,首先你需要导入reverse_lazy
class ArticleUpdateView(UpdateView):
.....
def get_success_url(self):
return reverse_lazy('article-detail', kwargs={'pk': self.object.pk})
如果您使用的是表单,您可以通过为表单设置 pull 或 get 方法来进行重定向,并将操作值设置为 url 您想要直接在 [=21] 中重定向的模板=].这是一个例子:
<form id="contactForm" name="updateArticle" action="{% url 'article-detail' %}" method="post">
{% csrf_token %}
{% for field in form %}
/* Your code */
{% endfor %}
<button type="submit">Update Post</button>
</form>
然后在您的 ArticleDetailView 中,您可以设置 post() 方法来呈现详细信息页面:
class ArticleDetailsView(View):
template_name = 'articles/article_details.html'
post(self, request, *args, **kwargs):
# Your code
return render(request, self.template_name, context)
您也可以使用 redirect() 方法代替 render()。您可以找到 documentation here.
from django.views.generic.edit import FormMixin
class ArticleUpdateView(View, FormMixin):
...
FormMixin
包含您寻求的魔法。
我正在使用基于视图 class 更新我的应用程序中名为 article 的文章。 我正在实现它,就像 UpdateView 的工作方式一样,但是我似乎无法在验证表单后将其重定向。我调用了 success_url 方法来重定向到详细视图,但它不起作用。我错过了什么吗?
我在模型中设置get_absolute_url,
#models.py
class Article(models.Model):
def get_absolute_url(self):
return reverse('articles:article-detail', kwargs={"id": self.id})
在网址中
#urls.py
app_name = 'articles'
urlpatterns = [
path('<int:id>/edit/', ArticleUpdateView.as_view(), name='article-edit'),
path('<int:id>/', ArticleDetailView.as_view(), name='article-detail'),
]
以及浏览量:
#views.py
class ArticleUpdateView(View):
template_name = 'articles/article_edit.html'
def get_success_url(self):
id = self.kwargs.get('id')
return reverse('articles:article-detail', kwargs={'id': id})
def get_object(self):
id = self.kwargs.get('id')
obj = None
if id is not None:
obj = get_object_or_404(Article, id=id)
return obj
def get(self, request, id=None, *args, **kwargs):
context = {}
obj = self.get_object()
if obj is not None:
form = ArticleModelForm(instance=obj)
context['article'] = obj
context['form'] = form
return render(request, self.template_name, context)
def post(self, request, id=None, *args, **kwargs):
context = {}
obj = self.get_object()
if obj is not None:
form = ArticleModelForm(request.POST, instance=obj)
if form.is_valid():
form.save()
context['article'] = obj
context['form'] = form
return render(request, self.template_name, context)
我尝试在 UpdateView class 上使用它,重定向似乎工作正常,我想在基于视图 class.
上使用它django 基础视图 class 不会自动调用 get_success_url()
之类的东西,这是添加到基于 class 的通用视图 [=11] 功能中的东西=] 从它继承的另一个 class。如果您想在基础视图中重定向,那么您需要实际进行重定向调用。
在您的 views.py 文件中,您可以导入 from django.http import HttpResponseRedirect
,然后在您视图中的 if form.isvalid():
语句中,您可以添加行 return HttpResponseRedirect(self.get_success_url())
。仅仅调用 get_success_url()
本身对你定义它的方式没有任何作用,因为 reverse()
快捷方式只是根据你传递给函数的名称和参数生成 url。
检查这个,首先你需要导入reverse_lazy
class ArticleUpdateView(UpdateView):
.....
def get_success_url(self):
return reverse_lazy('article-detail', kwargs={'pk': self.object.pk})
如果您使用的是表单,您可以通过为表单设置 pull 或 get 方法来进行重定向,并将操作值设置为 url 您想要直接在 [=21] 中重定向的模板=].这是一个例子:
<form id="contactForm" name="updateArticle" action="{% url 'article-detail' %}" method="post">
{% csrf_token %}
{% for field in form %}
/* Your code */
{% endfor %}
<button type="submit">Update Post</button>
</form>
然后在您的 ArticleDetailView 中,您可以设置 post() 方法来呈现详细信息页面:
class ArticleDetailsView(View):
template_name = 'articles/article_details.html'
post(self, request, *args, **kwargs):
# Your code
return render(request, self.template_name, context)
您也可以使用 redirect() 方法代替 render()。您可以找到 documentation here.
from django.views.generic.edit import FormMixin
class ArticleUpdateView(View, FormMixin):
...
FormMixin
包含您寻求的魔法。