{"id":307,"date":"2011-11-15T15:56:04","date_gmt":"2011-11-15T19:56:04","guid":{"rendered":"http:\/\/dashdrum.com\/blog\/?p=307"},"modified":"2011-11-15T15:56:48","modified_gmt":"2011-11-15T19:56:48","slug":"class-based-views-createview-example","status":"publish","type":"post","link":"https:\/\/dashdrum.com\/blog\/2011\/11\/class-based-views-createview-example\/","title":{"rendered":"Class Based Views: CreateView Example"},"content":{"rendered":"<p>For this example I&#8217;m not starting with a generic view.  That&#8217;s because the code includes support for an extra submit button &#8211; in this case &#8220;Save and Add Another&#8221;.  Without it, I would have used the generic view.<\/p>\n<p>Before:<\/p>\n<pre>\r\n\r\n@permission_required('calendars.add_eventtype')\r\ndef create_type(request):\r\n    evttypeform = EventTypeForm(request.POST or None)\r\n    \r\n    if evttypeform.is_valid():\r\n        evttypeform.save()\r\n        if '_addanother' in request.POST:\r\n            return HttpResponseRedirect(reverse('create_type'))\r\n    \r\n        return HttpResponseRedirect(reverse('list_type'))\r\n            \r\n    return render_to_response('eventtype_form.html', \r\n                              {'form' : evttypeform, 'create_form': True,\r\n                    'calendar_menu': CalendarName.menu.all(),   },\r\n                               context_instance=RequestContext(request))<\/pre>\n<p>Perhaps the Generic View would have looked something like this (not tested):<\/p>\n<pre>@permission_required('calendars.add_eventtype')\r\ndef create_type(request):\r\n    return create_object(request,\r\n                         form_class = EventTypeForm,\r\n                         post_save_redirect=reverse('list_type'),\r\n                         template_name='eventtype_form.html',\r\n                         extra_context={'create_form': True,\r\n                                        'calendar_menu': CalendarName.menu.all(),})    <\/pre>\n<p>After:<\/p>\n<pre>class TypeCreateView(CreateView):\r\n    template_name = 'eventtype_form.html'\r\n    model = EventType\r\n    form_class = EventTypeForm\r\n    \r\n    def get_success_url(self):\r\n        if '_addanother' in self.request.POST:\r\n            return reverse('create_type')\r\n        return reverse('list_type')\r\n    \r\n    ## Override dispatch to apply the permission decorator\r\n    @method_decorator(permission_required('calendars.add_eventtype'))\r\n    def dispatch(self, request, *args, **kwargs):\r\n        return super(TypeCreateView, self).dispatch(request, *args, **kwargs)\r\n    \r\n    ## Additional context\r\n    def get_context_data(self, **kwargs):\r\n        context = super(TypeCreateView, self).get_context_data(**kwargs)\r\n        context['calendar_menu'] = CalendarName.menu.all()\r\n        context['create_form'] = True\r\n        return context <\/pre>\n<p>One of the benefits of the class based views is to be able to override individual methods. Here the <code>get_success_url<\/code> method can handle the extra functionality of the &#8220;Add Another&#8221; button.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For this example I&#8217;m not starting with a generic view. That&#8217;s because the code includes support for an extra submit button &#8211; in this case &#8220;Save and Add Another&#8221;. Without it, I would have used the generic view. Before: @permission_required(&#8216;calendars.add_eventtype&#8217;) def create_type(request): evttypeform = EventTypeForm(request.POST or None) if evttypeform.is_valid(): evttypeform.save() if &#8216;_addanother&#8217; in request.POST: return &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/dashdrum.com\/blog\/2011\/11\/class-based-views-createview-example\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Class Based Views: CreateView Example&#8221;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-307","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/posts\/307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/comments?post=307"}],"version-history":[{"count":3,"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/posts\/307\/revisions"}],"predecessor-version":[{"id":310,"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/posts\/307\/revisions\/310"}],"wp:attachment":[{"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/media?parent=307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/categories?post=307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dashdrum.com\/blog\/wp-json\/wp\/v2\/tags?post=307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}