Наборы форм Django - объединение двух наборов моделей для редактирования полей в ОБА моделях - PullRequest
0 голосов
/ 19 февраля 2019

Я хотел бы редактировать поля в двух моделях как часть одной формы.Я знаю, что могу сделать это с помощью inline_formsets - однако я хочу отредактировать как родительскую, так и дочернюю модель, но не могу понять, как это сделать с помощью inline_formets.

Мои модели.py:

class ResultClass(models.Model):

    result_id = models.ForeignKey(Result,on_delete=models.CASCADE,
            db_column='result_id')
    evidence = models.TextField(null=True, blank=True)
    classified_by = models.ForeignKey(User,
            on_delete=models.CASCADE,
            db_column='classified_by',
            related_name='classified_by',
            null=True, blank=True)

    class Meta:
        db_table = "result_class"
        unique_together = (('result_id', 'evidence'),)



class ReportedResult(models.Model):

    sample_id = models.ForeignKey(Sample,
            on_delete=models.CASCADE, db_column='sample_id')
    result_class_id = models.ForeignKey(ResultClass,
            on_delete=models.CASCADE, db_column='result_class_id',
            related_name='result_class_id', null=True, blank=True)
    reported = models.BooleanField(default=False)
    date_reported = models.DateTimeField(auto_now=False,
            null=True, blank=True)


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

Так что в случае, если у меня есть 4 выдающихся объекта Result, которые не были классифицированы, я бы создал пустые экземпляры ResultClass и ReportedResult для каждого объекта Result.Затем я могу сделать model_formsets для каждой модели:

forms.py:

class ResultClassForm(forms.ModelForm):

    evidence = forms.CharField(
                widget=forms.Textarea(attrs={'rows': 3, 'cols': 60}),
                label='Evidence:',
                required=False,
            )

    class Meta:
        model = ResultClass
        fields = (
                'id',
                'evidence',
            )

class ReportedResultForm(forms.ModelForm):

    report = forms.ChoiceField(choices=(
                PRIMARY_CHOICES
            )
        )
    class Meta:
        model = ReportedResult
        fields = (
                'id',
                'report',
            )

Теперь в моих представлениях я создаю пустые экземпляры объектов ResultClass и ReportedResult для каждого из моих результатов.Затем я создаю набор форм для каждой из этих моделей:

views.py

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

    .... stuff ...

    for o in report_obj:

        result_class_obj = ResultClass.objects.get_or_create(
                result_id=o
            )[0]

        ReportedResult.objects.get_or_create(
                sample_id=sample_obj,
                result_class_id=result_class_obj,
            )   

    ### ReportedResult FORMSET
    result_class_obj = ResultClass.objects.filter(
                result_id__in=result_obj
            )

    ResultClassFormset = modelformset_factory(
                ResultClass,
                form=ResultClassForm,
                formset=BaseFormSet,
                extra=0,
            )
    res_class_formset = ResultClassFormset(
                prefix='result-class',
                queryset=result_class_obj
            )


    ### ReportedResult FORMSET
    reported_result_obj = ReportedResult.objects.filter(
                sample_id=sample_obj
            )
    ReportedResultFormset = modelformset_factory(
                ReportedResult,
                form=ReportedResultForm,
                formset=BaseFormSet,
                extra=0,
            )
    rep_res_formset = ReportedResultFormset(
                prefix='reported-result',
                queryset=reported_result_obj
            )

Мой вопрос - это создаст два набора форм, которые я затем смогу отобразить в своем HTML-шаблоне.Связанные формы ResultClass и ReportedResult будут помечены одинаковым префиксом, так как они оба были созданы из report_obj.Но это не похоже на лучшую практику?

Как я могу использовать наборы inline_formsets, чтобы иметь возможность редактировать ОБА этих моделей относительно одного объекта Result в той же форме набора форм?

...