Search code examples
pythondjangodjango-class-based-viewsinline-formset

I have the following view working on Django. Can I do the same with a Generic View?


I have the following view working on Django. Can I do the same with a Generic View?

# models :

RiskAssessment # contains name and information

RiskLine # contains many lines per (RiskAssessment ForeignKKey) #

def risk_view(request, pk=None):

    if  pk == None:
        return HttpResponseRedirect('/fm/riskassessment/') # No pk show list
    else:
        risk = RiskAssessment.objects.get(id = pk)

    RiskLineSet    = inlineformset_factory(RiskAssessment, RiskLine, can_delete=False, exclude=('user',))    

    if request.method == "POST":
        riskform      = RiskForm(request.POST, instance=risk)
        risklineset   = RiskLineSet(request.POST, request.FILES, instance=risk)

        if riskform.is_valid() and risklineset.is_valid():
            riskform.save()
            risklineset.save()

            # Redirect to somewhere
            if '_save' in request.POST:
                return HttpResponseRedirect('/fm/riskassessmentlist/')
            if '_addanother' in request.POST:
                return HttpResponseRedirect('/fm/riskassessmentnew/')

    else:
        riskform      = RiskForm(instance=risk)
        risklineset   = RiskLineSet(instance=risk)

    return render_to_response('formulare/RiskAssessment/risk.html', {
        'riskform'    : riskform,
        'risklineset'  : risklineset,
    }, context_instance=RequestContext(request) )

Solution

  • You could try the following approach:

    from django.views.generic import TemplateView
    
    
    class RiskView(TemplateView):
        template_name = 'formulare/RiskAssessment/risk.html'
        risk = None
        RiskLineSet = None
    
        def dispatch(self, request, *args, **kwargs):
            if self.kwargs.get('pk', None) is None:
                return HttpResponseRedirect('/fm/riskassessment/')  # No pk show list
            else:
                self.risk = RiskAssessment.objects.get(id=pk)
    
            self.RiskLineSet = inlineformset_factory(RiskAssessment, RiskLine, can_delete=False, exclude=('user',))
            return super(RiskView, self).dispatch(self, request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
            context = super(RiskView, self).get_context_data(**kwargs)
            context['riskform'] = RiskForm(instance=self.risk)
            context['risklineset'] = self.RiskLineSet(instance=self.risk)
            return context
    
        def post(self, request, *args, **kwargs):
            riskform = RiskForm(request.POST, instance=self.risk)
            risklineset = self.RiskLineSet(request.POST, request.FILES, instance=self.risk)
    
            if riskform.is_valid() and risklineset.is_valid():
                riskform.save()
                risklineset.save()
    
                # Redirect to somewhere
                if '_save' in request.POST:
                    return HttpResponseRedirect('/fm/riskassessmentlist/')
                if '_addanother' in request.POST:
                    return HttpResponseRedirect('/fm/riskassessmentnew/')
                # Otherwise, I guess you want to redirect to the same view
                return HttpResponseRedirect('url_of_the_current_view')