Фильтровать Django ModelForm без проверки - PullRequest
0 голосов
/ 24 мая 2018

У меня есть форма, которую я хотел бы отфильтровать на основе информации, переданной другой формой, но , но пока не проверяю ее :

forms.py:

class SampleRunSearchForm(forms.ModelForm):

    class Meta:
        model = SampleRun
        fields = ('id',)

    def __init__(self, sr_obj, *args, **kwargs):
        super(SampleRunSearchForm, self).__init__(*args, **kwargs)

        self.fields['id'] = forms.ChoiceField(required=True,
                        label='Sample:',
                        widget=forms.CheckboxSelectMultiple,
                        choices=((s.id, s) for s in sr_obj)
                    )
        self.helper = FormHelper()
        self.helper.layout = Layout(
                Field('id', css_class='sample-run-display',),
                Submit('submit', 'Report samples', css_class='upload-btn')
            )
        self.helper.form_method = 'POST'

views.py:

class SearchSampleRun(View):

    samplerunform = SampleRunSearchForm
    template_name = 'results/samplerun_search_form.html'

    def get(self, request, *args, **kwargs):

        self.run_obj = get_object_or_404(Run, id=kwargs['run_id'])
        self.choice = kwargs['choice']

        self.sample_run_obj = self.obtainCorrectSamples()
        samplerunform = self.samplerunform(sr_obj=self.sample_run_obj)

        context = {'samplerunform': samplerunform}

        return render(request, self.template_name, context)


    def post(self, request, *args, **kwargs):

        samplerunform = self.samplerunform(request.POST)
        if samplerunform.is_valid(): 
             HttpResponseRedirect(...somewhere to display information)

        context = {}

        return render(request, self.template_name, context)

Первоначальная форма (не показана) принимает поле char и перенаправляет в мое представление SearchSampleRun с помощью ** kwargs.Я хочу отфильтровать свой SampleRunSearchForm на основе этих kwargs и отобразить список флажков - отфильтрованный объект модели из модели SampleRun.Это работает, но когда я нажимаю эти кнопки и отправляю форму, она снова инициализируется, и sr_obj имеет значение None, поэтому поле формы выдает ошибку.

Я попытался использовать:

sr_obj = kwargs.pop('sr_obj', None)

В моем методе init (), но это должен быть способ динамической фильтрации набора запросов формы для отображения подмножества значений перед проверкой с целью проверки при отправке этой формы?

1 Ответ

0 голосов
/ 24 мая 2018

Просто добавьте проверку в метод __init__ и переопределите поля id, только если sr_obj не является пустым:

def __init__(self, sr_obj, *args, **kwargs):
    super(SampleRunSearchForm, self).__init__(*args, **kwargs)
    if sr_obj:
        self.fields['id'] = forms.ChoiceField(required=True,
                        label='Sample:',
                        widget=forms.CheckboxSelectMultiple,
                        choices=((s.id, s) for s in sr_obj)
                    )
    self.helper = FormHelper()
    self.helper.layout = Layout(
            Field('id', css_class='sample-run-display',),
            Submit('submit', 'Report samples', css_class='upload-btn')
        )
    self.helper.form_method = 'POST'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...