2017-09-18 5 views
0

J'ai un formset en ligne dans Django. Et je me demande comment puis-je définir max_value pour un formulaire qui est dans ce formset basé sur les paramètres d'instance. Le problème est que lorsque nous créons un formset en utilisant inlineformset_factory nous n'y passons pas une instance du formulaire, mais la classe, donc je ne sais pas comment passer les paramètres là.comment passer le paramètre à un formulaire lors de la création de formset

Lorsque le formulaire est initialisé, un objet instance est déjà disponible dans les kwargs qui y sont passés. Mais pour des raisons étranges, quand j'essaie de régler max_value rien ne se passe. En ce moment, j'ai trouvé une solution assez laide pour définir l'attribut max widget. Celui-ci fonctionne mais je me demande s'il existe une bonne façon de le faire.

from .models import SendReceive, Player 

from django.forms import inlineformset_factory, BaseFormSet, BaseInlineFormSet 


class SRForm(forms.ModelForm): 
     amount_sent = forms.IntegerField(label='How much to sent?', 
             required=True, 
             widget=forms.NumberInput(attrs={'min': 0, 'max': 20}) 
             ) 

     def __init__(self, *args, **kwargs): 
      super(SRForm, self).__init__(*args, **kwargs) 
      curmax = kwargs['instance'].sender.participant.vars['herd_size'] 
      self.fields['amount_sent'].widget.attrs['max'] = int(curmax) 

     class Meta: 
      model = SendReceive 
      fields = ['amount_sent'] 


SRFormSet = inlineformset_factory(Player, SendReceive, 
             fk_name='sender', 
             can_delete=False, 
             extra=0, 
             form=SRForm,) 
formset = SRFormSet(self.request.POST, instance=self.player) 

Répondre

1

Vous pouvez utiliser functools pour créer une version cari de votre classe Form:

from functools import partial, wraps 


# create a curried form class 
form_with_params = wraps(SRForm)(partial(SRForm, your_param='your_value')) 

# use it instead of the original form class 
SRFormSet = inlineformset_factory(
          Player, 
          SendReceive, 
          # ... 
          form=form_with_params, 
          ) 
+0

Merci! Je viens de résoudre un peu autrement, mais votre solution semble plus universelle. Voici comment je l'ai fait: https://gist.github.com/chapkovski/b6fd6134124d88d671ed7b3b1baa4b81 Donc, au lieu de réécrire 'max_value', il suffisait de réécrire un champ entier dans init. –