Search code examples
django-formsdjango-class-based-viewsdjango-sessionsdjango-model-field

I'm trying to add a dynamic queryset to a model-form/formset field from a url kwarg <int:url_kwarg>, no luck so far


Edit: It appears that the problem I'm experiencing is directly related to the formset_factory() call. For some reason or other, I have been unable to access the kwargs from the view if I pass the form through the function.

I'm building a web app that utilizes high normalization in the data-structure. There are many many-to-many and one-to-many relationships to prevent excess null records and database-bloat. I want to add more entries to a model while excluding existing entries from the model.choice field.

my code looks like this: the form:

class ExtraAddForm(forms.ModelForm):
    def __init__(self, url_kwarg, *args, **kwargs):
        super(ExtraAddForm, self).__init__(self, *args, **kwargs)
        list_to_exclude = []
        query_target = models.Model.objects.get(fk_id=url_kwarg)
        for object in query_target:
            list_to_exclude.append(object.fk_id.id)
        new_queryset = models.Model.objects.exclude(fk_id__in=list_to_exclude)
        self.fields['fk_id'].queryset= new_queryset
    class Meta:
       model = models.Model
       fields= ['fk_id','field_b'}

the view:

class AddOjbectsView(FormView): 


    formset = formset_factory(ExtraAddForm(url_kwarg), can_delete=True)
    model = models.Model
    url_kwarg = 'url_kwarg'
    form_class = formset
    template_name = 'some-template.html'
    extra_context = {'some_object': models.Model2.objects.all,
                     'model_object': models.Model.objects.all,
                     'formset': formset,
                     'view_type_create': True
                     }

    def __init__(self, *args, **kwargs):
         kwargs['url_kwarg']= self.kwargs.get(self.url_kwarg)
         super().__init__(self,*args,**kwargs)

    def get(self, request, *args, **kwargs):
        request.session['url_kwarg'] = self.kwargs.get(self.url_kwarg)
        return super().get(self, request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        #this works so I'm not re-typing it


    def get_context_data(self, **kwargs):
        """Insert the form into the context dict."""

        if 'url_kwarg' not in kwargs:
            kwargs['url_kwarg'] = self.kwargs.get(self.url_kwarg)
        return super().get_context_data(**kwargs)
        #this works, but only in the get_context. Its not working as a solution to my problem.

    def get_success_url(self):
        #this works, not re-typing

My template has Javascript to handle multiple formsets, and I've tested it with a non-dynamic queryset. The only piece I'm having trouble with is taking the keyword argument from the URL and passing it to the form at init.


Solution

  • It would seem that the answer to my problem is to deprecate the process in favor of session variables at form validation, making use of the clean data functions. My methods above were generated from ignorance of the order of django operations, and shouldn't preoccupy anyone any further.