Я хотел бы редактировать поля в двух моделях как часть одной формы.Я знаю, что могу сделать это с помощью 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 в той же форме набора форм?