基于视图 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 包含您寻求的魔法。