Django - 类视图 - "没有可重定向的URL"

53

我正在使用通用的CreateView,如下所示:

#urls.py

from django.conf.urls.defaults import *
from django.views.generic import CreateView
from content.models import myModel

urlpatterns = patterns('myApp.views',
    (r'myCreate/$', CreateView.as_view(model=myModel)),
)

有一个名为mymodel_form.html的模板:

<form method="post" action="">
{% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Submit" />
</form>

当我提交表单时,新对象已经创建但我收到了错误信息:

在...上不正确的配置

没有可重定向到的URL。请提供URL或在Model上定义get_absolute_url方法。

如何指定成功后要重定向的URL?

5个回答

79

你是否尝试传递 success_url 参数呢?例如:

CreateView.as_view(model=myModel, success_url="/success/")

或者如果您想重定向到一个命名视图:

CreateView.as_view(model=myModel, success_url=reverse('success-url'))

1
那就是我忘记的。谢谢。 - Pierre de LESPINAY
12
没问题。关键是success_urlCreateView下没有被记录,而是在ModelFormMixin下记录的。有时候Django文档不太容易理解。 - NickAldwin
好的,明白了,这份文档确实很好,但是这里有太多的概念...并不总是容易找到需要的内容。 - Pierre de LESPINAY
1
@Glide可能需要一些搜索。顺便提醒一下,当答案有用时不要忘记点赞。谢谢! - NickAldwin
7
如果我想要“回到我来时的地方”,重定向回启动创建页面,该怎么办? - Bryce
@NickAldwin 怎样才能通过 success_url 回到上一级?我的帖子在 /blog/comments/new,我想重定向到 /blog/comments。 - J. Hesters

23

你也可以尝试在你的模型中定义get_absolute_url。例如:

class Something(models.Model):
    name = models.CharField(max_length=50, verbose_name='name')

    class Meta:
        pass

    def get_absolute_url(self):
        return u'/some_url/%d' % self.id 

当主要答案无法解决问题时,这个对我有用。 - Harry Moreno

1
在视图中添加:

def form_valid(self, form):

   return self.render_to_response(self.get_context_data(form=form))

0

views.py/

from django.views.generic import CreateView
from .models import myModel

class createView(CreateView):
    model = myModel
    fields = ['your fields', ...'']

    def get_success_url(self):
        return reverse('some_url')

urls.py/(您的应用程序)

from django.urls import path
from . import views

urlpatterns = [
    path('create/', views.createView.as_view(), name='create') 
] 

请问您能否解释一下为什么您的解决方案有效,并且为什么它是一个好答案。https://stackoverflow.com/help/how-to-answer - Marcello B.
我建议不要使用这种命名方式。首先,你的视图应该以大写字母开头,例如CreateView。其次,将你的类命名为createView会使它很难与CreateView区分开来。 - Ali

-1
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post
    success_url = '/'
    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接