2016-01-13 12 views
10

Voglio usare django formset nella mia vista basata sulla classe. questa è la vista,django __init__ metodo che causa argomento errore

class PeriodCreate(RequestPassingFormViewMixin, WammuCreateView): 
    model = Chain 
    template_name = 'dashboard/period_form.html' 
    form_class = ChainForm 

    def get_object(self): 
     chain = Chain.objects.get(pk=self.kwargs['chain_pk']) 
     return chain 


    def get_success_url(self): 
     return reverse('dashboard_period_list', kwargs={'chain_pk': self.object.chain.id, })              


    def get_context_data(self, **kwargs): 
     context = super(PeriodCreate, self).get_context_data(**kwargs) 
     return context 

    def get_form_kwargs(self, *args, **kwargs): 
     kwargs = super(PeriodCreate, self).get_form_kwargs(*args, **kwargs) 
     chain = get_object_or_404(Chain, pk=self.kwargs['chain_pk']) 
     period = Period(chain=chain) 
     kwargs['instance'] = period 
     return kwargs 

    def get(self, request, *args, **kwargs): 
     self.object = None 
     form_class = self.get_form_class() 
     form = self.get_form(form_class) 
     PeriodInlineFormSet = inlineformset_factory(Chain, Period, 
               form=PeriodInlineForm, 
               can_delete=True, 
               extra=12) 
     PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm, request=request, chain=self.object)) 
     period_formset = PeriodInlineFormSet() 
     return self.render_to_response(
     self.get_context_data(form=form, 
           period_inline_formset=period_formset)) 
    def post(self, request, *args, **kwargs): 
     self.object = Chain() 
     form = self.get_form(self.form_class) 
     PeriodInlineFormSet = inlineformset_factory(Chain, Period, 
                 form=PeriodInlineForm, 
                 can_delete=True, 
                 extra=5) 
     PeriodInlineFormSet.form = staticmethod(curry(PeriodInlineForm)) 

     if form.is_valid(): 
      self.object = form.save(commit=False) 

      period_formset = PeriodInlineFormSet(request.POST, instance=self.object) 

      if period_formset.is_valid(): 
       self.object.save() 
       period_formset.save() 
       return super(PeriodCreate, self).form_valid(form) 
      else: 
       return self.render_to_response(
        context=self.get_context_data(form=form, period_inline_formset=period_formset)) 

     else: 
      period_formset = PeriodInlineFormSet(request.POST,instance=self.object) 
      return self.render_to_response(
       context=self.get_context_data(form=form, period_inline_formset=period_formset)) 

e questa è la mia forma,

class PeriodForm(RequestPassingFormMixin, ModelForm): 
    class Meta: 
     model = Period 
     fields = ['start_date', 'end_date', 'year', 'description'] 

ed ecco il mio 'RequestPassingFormMixin':

class RequestPassingFormMixin(object): 

    def __init__(self, request, param, *args, **kwargs): 
     self.request = request 
     self.param = param 
     super(RequestPassingFormMixin, self).__init__(*args, **kwargs) 

ma sto ottenendo il seguente errore,

TypeError at .... 
__init__() takes at least 3 arguments (2 given) 

questo errore che indica il modello in cui ho reso il formset, in modo da sto dando il modello anche (solo la parte in cui ho reso la foresta),

    <tbody> 
         {% csrf_token %} 
         {{ period_inline_formset.management_form }} 
         {% for period_form in period_inline_formset %} 
          {% for hidden in period_form.hidden_fields %} 
           {{ hidden }} 
          {% endfor %} 
          {{period_form.pk}} 
          <tr> 

           <td>{{ period_form.start_date }}</td> 
           <td>{{ period_form.end_date }}</td> 
           <td>{{ period_form.year }}</td> 
           <td>{{ period_form.description }}</td> 

           <td> {% if period_formset.can_delete %} 
            {{ period_form.DELETE }} {% endif %}</td> 
          </tr> 
         {% endfor %} 
       </tbody> 

io non sono abituato ad usare Django formset, per quanto Immagino, non è un errore di formset, o potrebbe essere, forse mi manca qualcos'altro qui, ma dopo una lunga scoperta, non riesco a capirlo ...

risposta

3

Hai qualche problema con il tuo codice ; ma per iniziare con l'errore effettivo, si passa solo in *args, **kwargs al metodo __init__ di RequestPassingFormMixin, quando nella definizione sono necessari due ulteriori argomenti obbligatori posizionali, ovvero request e param.

La linea incriminata è:

super(RequestPassingFormMixin, self).__init__(*args, **kwargs) 

Davvero non hai nemmeno bisogno di questa linea; dal momento che non stai annullando nulla. Puoi semplicemente rimuoverlo.

In effetti, è possibile rimuovere l'intero mixin, se è tutto ciò che fa perché la richiesta ei parametri sono già disponibili per tutte le viste basate su classi.

Inoltre, non ho idea del motivo per cui si sta utilizzando questo mixin come genitore per la classe del modulo: non è richiesto affatto; e non farà quello che vuoi che faccia.

Hai altri problemi: stai sovrascrivendo i metodi, ma non modifichi le loro funzionalità, quindi il tuo codice in realtà non fa nulla di diverso.

Ho un paio di suggerimenti:

  1. Se quello che cercate è una classe a base di creare una vista che è compatibile con formsets, utilizzare django-extra-views.

  2. Questa riga chain = Chain.objects.get(pk=self.request.session.get('chain_pk')) non è impostata su chain in qualsiasi punto della classe, quindi è effettivamente persa. Non sono sicuro del perché tu abbia questa linea.

+0

grazie per la risposta, mi aiuta a mostrare la mia linea formset, sì c'era un sacco di bug sul mio codice, in realtà la sua non è il mio codice, è un codice di produzione e devo lavorare su it.now il problema è che il mio modulo non sta salvando o puoi dire che il modulo non è valido, quindi torna in forma quando voglio pubblicarlo o salvarlo. Per favore, aiutami ulteriormente a risolvere questo problema, potrebbe esserci un problema nel mio ' post 'metodo, ho detto' potrebbe essere 'perché, non sono abituato a lavorare con django inline formset.so che questa è una domanda aggiuntiva per te. Sarebbe bello se mi aiutassi ulteriormente su questo problema. @ Buran Khalid – RTan

+0

Basta fare un'altra domanda con i dettagli e aggiungere un collegamento a questa domanda; Sono sicuro che non sei l'unico ad affrontare un problema con i formulari. –

+0

ho postato una nuova domanda sul problema, questo il link http://stackoverflow.com/questions/35123355/data-is-not-saving-in-django-formset – RTan

Problemi correlati