【问题标题】:django createview with success_url being the same view?django createview with success_url 是同一个视图?
【发布时间】:2014-10-25 15:27:48
【问题描述】:

我正在使用 Django CreateView,我想将 success_url 设置为相同的视图,以便在发布表单时,它显示相同的页面,并且我可以在表单之外显示创建的对象以防万一想添加一个新的。但是,self.object 是 None 因为在 BaseCreateView 中:

def post(self, request, *args, **kwargs):
    self.object = None
    return super(BaseCreateView, self).post(request, *args, **kwargs)

我的结论是 CreateView 不会在成功后重新显示?

【问题讨论】:

  • 您可以使用formset 代替,以便用户可以在提交之前通过相同的表单添加多个对象。有一个很好的库可以为这种功能添加基于类的视图,称为django-extra-views

标签: django django-views


【解决方案1】:

我看错地方了。

我必须覆盖 form_valid 才能不重定向到 URL (return HttpResponseRedirect(self.get_success_url()))

 def form_valid(self, form):
        self.object = form.save()

        # Does not redirect if valid
        #return HttpResponseRedirect(self.get_success_url())

        # Render the template
        # get_context_data populates object in the context 
        # or you also get it with the name you want if you define context_object_name in the class
        return self.render_to_response(self.get_context_data(form=form))

【讨论】:

    【解决方案2】:

    我认为您不需要正在创建的对象重定向到视图的相同 URL。我会使用reverse:

    class MyModelCreate(CreateView):
        model = MyModel
        success_url = reverse('path.to.your.create.view')
    

    【讨论】:

    • 是的,这就是我所做的,但是在模板中我希望 self.object 拥有创建的对象,但它是 None,因为它在 post 方法中设置为 None。
    • 成功后将用户重定向到表单的 URL 时,新视图不会对刚刚创建的对象有任何引用,因为它只包含对正在创建的对象的引用。如果要显示最后创建的对象,则必须手动获取它,例如使用自定义 get_success_url 方法(请参阅doc
    • 我其实是看错地方了,我居然要覆盖form_valid。我添加了我的问题的答案。
    • 我认为这个解决方案更简洁。在我的情况下,我不得不重写 get_success_url() 因为当 reverse() 直接分配给 success_url 时,Django Web 服务器在启动时抱怨循环导入。
    【解决方案3】:

    所以 6 年后,我在进行项目时遇到了这个问题。如果有人在不久的将来也遇到这个问题,这里有一个简单易行的解决方法,但可能不推荐,但它为我完成了工作。

    顺便说一句,我喜欢使用ClassBasedViews

    在您的views.py 文件中

    class MyMode(CreateView):
        model = my_model
        success_url = '/path-to-webpage/'
         
    
    

    所以我基本上所做的就是在success_url 下的网页路径中进行硬编码,从而解决了问题。 这适用于您不打算随时更改 URL 模式,否则您还必须更改 views.py 文件中的 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 2011-11-15
      • 2022-08-19
      • 2014-02-01
      • 2018-10-30
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多