Я пытаюсь добавить динамический набор запросов в поле модели-формы / формы набора из URL-адреса kwargпока не повезло - PullRequest
0 голосов
/ 07 ноября 2019

Редактировать: Похоже, проблема, с которой я столкнулся, напрямую связана с вызовом formset_factory(). По какой-то причине я не смог получить доступ к kwargs из представления, если я передал форму через функцию.

Я создаю веб-приложение, которое использует высокую нормализацию в структуре данных,Существует много взаимосвязей «многие ко многим» и «один ко многим», которые предотвращают избыточные нулевые записи и переполнение базы данных. Я хочу добавить больше записей в модель, исключая существующие записи из поля model.choice.

мой код выглядит следующим образом: форма:

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'}

представление:

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

Мой шаблон имеет Javascript для обработки нескольких наборов форм, и я протестировалэто с нединамическим набором запросов. Единственная проблема, с которой у меня возникают проблемы - это взять аргумент ключевого слова из URL и передать его в форму по адресу init .

1 Ответ

0 голосов
/ 07 ноября 2019

Вы пробовали использовать метод FormView.get_form_kwargs? Это описано в документах

class AddOjbectsView(FormView): 
    def get_form_kwargs(self):
        form_kwargs = super().get_form_kwargs()
        <b>form_kwargs['url_kwarg'] = self.kwargs['url_kwarg']</b>
        return form_kwargs
...