2017-09-18 3 views
0

J'essaie d'afficher un formset pour un utilisateur particulier.L'objet 'User' n'a pas d'attribut 'get' avec formset (passant l'utilisateur pour obtenir un ensemble de requêtes)

Si l'utilisateur est sur l'onglet médical, il doit alors afficher un minuscule formulaire (une case à cocher et une zone de texte) pour chaque personne à charge de l'utilisateur.

Dans mon views.py j'ai ceci:

def get_dep_form(benefit_tab, user): 
    if benefit_tab == 'medical': 
     DepMedFormSet = formset_factory(DependentMedicalBenefitForm) 
     link_formset = DepMedFormSet(user) 
    else: 
     return None 
    return link_formset 

Dans mon forms.py j'ai ceci:

class DependentMedicalBenefitForm(forms.ModelForm): 
    has_medical = forms.BooleanField() 
    med_group_id = forms.CharField(max_length=10) 
    class Meta: 
     model = Dependent 
     fields = [ 
      'has_medical', 'med_group_id' 
     ] 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user') 
     queryset = Dependent.objects.filter(employee=self.user) 
     super(DependentMedicalBenefitForm, self).__init__(*args, **kwargs) 
     self.fields['has_medical'].queryset = queryset 
     self.fields['med_group_id'].queryset = queryset 

Dans mon views.py je reçois la forme comme ceci:

def index(request, benefit_tab=None): 
    #stuff 
    if benefit_tab: 
      link_formset = get_dep_form(benefit_tab, request.user) 
return render(request, 'benefits/index.html', { 
    #stuff 
    'link_formset': link_formset, 
}) 

Je cours dans l'erreur: 'User' object has no attribute 'get'Si je ne passe pas un utilisateur, et commentez la fonction init , alors il affiche une case à cocher et une zone de texte comme prévu - mais je n'arrive pas à comprendre pourquoi passer l'utilisateur de cette façon ne fonctionne pas. Points bonus: si vous savez comment préremplir le formset avec les données correspondantes, c'est-à-dire une fois que j'ai dépassé l'erreur 'User'.

+0

Avez-vous copié incorrectement l'index? Il n'y a pas d'indentation sur la ligne de retour. Aussi, qu'avez-vous fait pour affiner la ligne qui provoque l'erreur? – Acccumulation

Répondre

0

Vous passez l'utilisateur en tant qu'argument positionnel à l'instanciation du formset, mais le formset y attend les données POST. Ce que vous voulez, c'est transmettre cette valeur aux formulaires , en tant qu'arg mot clé.

Heureusement, depuis Django 1.9 formsets supportent cela via le form_kwargs argument. Donc, vous devez faire:

link_formset = DepMedFormSet(form_kwargs={'user': user}) 

Vous ne montrent pas le code où vous processus formset, mais souvenez-vous de passer aussi que form_kwarg là aussi.