سؤال

My app has a Family model with a foreign key to the FamilyMember model. The FamilyMember model is what I use for authentication.

I am using an inlineformset_factory to allow a user to modify all of the FamilyMember records for the Family that he belongs to. What I want to do is modify the queryset of the "email_list" for each family member. The queryset filter should be based on the is_staff flag for that specific family member. Note, it should NOT be based on the is_staff for the user that is logged in. This means that some family members of the family will use one query and other family members will use a different query.



# FORM 
class FamilyMemberForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(FamilyMemberForm, self).__init__(*args, **kwargs)
        if self:
            self.fields["email_list"].queryset = EmailList.objects.filter(is_active=False)
        else:
            self.fields["email_list"].queryset = EmailList.objects.filter(is_active=True)
    class Meta:
        model = FamilyMember
        fields = ['first_name', 'middle_name', 'last_name', ... 'email_list']


FamilyMemberFormset = inlineformset_factory(Family, FamilyMember, can_delete=False, form=FamilyMemberForm, extra=0)


# VIEW

def manage_family_member(request):
    email_list_description = EmailList.objects.filter(is_active=True)
    f = get_object_or_404(Family, id=request.user.family.id)
    form = FamilyForm(instance=f)
    fm = FamilyMemberFormset(instance=f)
    if request.method == 'POST':
        form = FamilyForm(request.POST, instance=f)
        if form.is_valid():
            f = form.save(commit=False)
            fm = FamilyMemberFormset(request.POST, request.FILES, instance=f)
            if fm.is_valid():
                f.save()
                fm.save()
                return redirect('/school/thanks/')

    context = RequestContext(request,{
        'email_list_description': email_list_description,
        'form': form,
        'family_member_formset': fm,
    })
    return render_to_response("school/family/manage_family_members.html", context)

هل كانت مفيدة؟

المحلول

schillingt provided the answer in the comments above. Here is what I ended up changing:


class FamilyMemberForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(FamilyMemberForm, self).__init__(*args, **kwargs)
        instance = kwargs.pop('instance', None)
        if instance.is_staff:
            self.fields["email_list"].queryset = EmailList.objects.filter(is_active=False)
        else:
            self.fields["email_list"].queryset = EmailList.objects.filter(is_active=True)

Of course, I will not be using the "is_active=False" and "is_active=True" in my actual query but it provided me a very quick way of testing my code.

Thanks!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top