【问题标题】:Using Django CreateView without Form to Create Object使用没有表单的 Django CreateView 创建对象
【发布时间】:2011-09-07 12:21:37
【问题描述】:

我在 django 1.3 中使用基于分类的视图,并试图弄清楚如何在不使用表单的情况下创建对象。我不需要任何用户输入来创建对象,但我仍然收到模板丢失的错误消息。下面是我当前的视图,我尝试对 form_valid 方法进行子类化,但它不起作用。任何帮助将不胜感激。

class ReviewerCreateView(CreateView):
    model = Reviewer

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.role = 2
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

【问题讨论】:

    标签: django-models django-views django-class-based-views


    【解决方案1】:

    CreateView 是一个专门的视图,其目的是在 GET 上显示表单并验证表单数据并基于 POST 上的表单数据创建新对象。

    由于您不需要显示表单和处理表单数据,因此 CreateView 不是您工作的工具。

    您要么需要一个普通的基于函数的旧视图,或者,如果您更喜欢使用基于类的视图,则从 View 派生并覆盖 get()post()。例如,调整您的示例代码:

    class ReviewerCreator(View):
        def get(self, request, *args, **kwargs):
             Reviewer(user=request.user, role=2).save()
             return HttpResponseRedirect('/your_success_url/')
    

    【讨论】:

    • 感谢您为我指明正确的方向。我正在使用 django-registration 并将帐户创建逻辑添加到激活功能中,并且它可以正常工作。
    • 使用 GET 方法在后端创建资源是不好的做法。应该使用 POST/PUT/PATCH
    【解决方案2】:

    如果视图不需要表单,我不认为它需要对表单做任何明确的事情。

    您可以实例化 Reviewer 对象。它只是一个 python 对象。

    class ReviewerCreateView(CreateView):
        model = Reviewer
    
        self.object.user = self.request.user
        self.object.role = 2
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2018-12-09
      • 2019-06-06
      • 1970-01-01
      相关资源
      最近更新 更多