Набор форм Django - как задать разные наборы запросов для каждой формы в наборе моделей - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть форма для модели - ClinicallyReportedSample, которая ссылается на образец модели.

Я пытаюсь создать набор форм для ClinicallyReportedSample, где на основе набора запросов Sample отображается определенное количество форм, чтобы пользователь мог добавлять данные.

В настоящее время модель Sample имеет записи, но модель ClinicallyReportedSample полностью пуста:

Модель:

class Sample(models.Model):

    request_number = models.PositiveIntegerField()
    year = models.PositiveIntegerField()


    class Meta:
        db_table = "sample"
        unique_together = (('request_number', 'year'),)

    def __str__(self):
        return("%s/%s" %(self.request_number, self.year))



class ClinicallyReportedSample(models.Model):

    sample_id = models.ForeignKey(Sample,
                                on_delete=models.CASCADE,
                                db_column='sample_id')


    reported = models.BooleanField(default=False)
    evidence = models.TextField(null=True, blank=True)

    ... other fields ...

    class Meta:
        db_table = "clinically_reported_sample"
        unique_together = (('sample_id'),)

    def __str__(self):
        clinically_reported_sample = str(self.sample_id)
        return(clinically_reported_sample)

Мне нужны формы модели ClinicalReportedSample внутри набора форм, которые относятся к набору запросов модели образца.

Например, образцы объектов с pk 1, 2 и 3:

forms.py:

class BaseCRSFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.queryset = ClinicallyReportedVariant.objects.none()


class CRSForm(forms.ModelForm):

    class Meta:
        model = ClinicallyReportedSample
        fields = ('sample_id', 'evidence',)

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

Поэтому я пытаюсь сделать это, используя набор запросов в моем наборе форм

views.py:

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


    sample_obj = Sample.objects.filter(id__in=[1, 2, 3])

    formset = modelformset_factory(
                ClinicallyReportedSample,
                form=self.crsform,
                formset=BaseCRSFormSet,
                extra=3,
            )


    formset = formset(queryset=sample_obj)

но это отображается как три формы, с объектами ALL Sample набор запросов не работает. Это правильный путь?

1 Ответ

0 голосов
/ 12 сентября 2018

Вам нужно будет установить Sample queryset по умолчанию в none:

class CRSForm(forms.ModelForm):

    class Meta:
        model = ClinicallyReportedSample
        fields = ('sample_id', 'evidence',)

    sample_id = forms.ModelChoiceField(queryset=Sample.objects.none())

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

И затем, когда вы создаете экземпляр набора форм вручную, присвойте набор запросов следующим образом:

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

    sample_obj = Sample.objects.filter(id__in=[1, 2, 3])

    formset = modelformset_factory(
                ClinicallyReportedSample,
                form=self.crsform,
                formset=BaseCRSFormSet,
                extra=3,
            )


    formset = formset(queryset=sample_obj)

    for form in formset:
        form.fields['sample_id'].queryset = sample_obj

Обратите внимание, что вам также придется вручную устанавливать набор запросов в вашей функции POST, иначе он не будет проверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...