Джанго несколько Inlineformset_factory. Использование одной "дочерней" модели и нескольких родительских модулей в одной форме
Я пытаюсь создать один экземпляр формы, используя несколько ссылок на внешние ключи из одной модели. Я довольно новичок в Django, поэтому я не совсем уверен, как это реализовать. Документы дают только одну ссылку на внешний ключ для использования inlineformset_factory. Причиной такого большого количества ссылок на FK является то, что каждая ссылочная таблица имеет свои собственные поля auto_update и auto_update_now, которые необходимо обновлять отдельно, поэтому я думаю, что они должны оставаться такими же! Открыты для любых предложений. Спасибо!
class HiringPlan(models.Model):
"""
SHORTLISTED = 'sht'
FIRST_INTERVIEW = 'inp'
SECOND_INTERVIEW = 'inp'
THIRD_INTERVIEW = 'inp'
OFFER = 'off'
ACCEPTED = 'acc'
WITHDRAWN = 'wtd'
"""
STATUS_CHOICES = (
('Added', 'Added'),
('Assigned Role', 'Assigned Role'),
('Shortlisted', 'Shortlisted'),
('In Process', 'In Process'),
('Rejected', 'Rejected'),
('Offered', 'Offered'),
('Accepted', 'Accepted'),
('Withdrawn', 'Withdrawn'),
('Started', 'Started'),
('Exited', 'Exited'),
)
role_plan = models.ForeignKey(
'RolePlan.RolePlan',
on_delete=models.CASCADE,
)
status = models.CharField(
default=None,
max_length=15,
choices=STATUS_CHOICES
)
status_date_change = models.DateTimeField(auto_now=True, null=True, blank=True)
shortlisted = models.ForeignKey('Shortlisted', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_shortlisted')
first_interview = models.ForeignKey('FirstInterview', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_first_interview')
second_interview = models.ForeignKey('SecondInterview', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_second_interview')
third_interview = models.ForeignKey('ThirdInterview', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_third_interview')
offer = models.ForeignKey('Offer', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_offer')
accepted = models.ForeignKey('Accepted', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_accepted')
withdrawn = models.ForeignKey('Withdrawn', on_delete=models.CASCADE, null=True, blank=True,
related_name='candidate_withdrawn')
candidate_has_hiring_plan = models.ManyToManyField('AddCandidates.Candidate',
through='CandidateHasHiringPlan')
def get_absolute_url(self):
return reverse('hiring-plans:view-hiring-plans')
def __str__(self):
return "%s %s" % (self.role_plan.code, self.role_plan.role)
class Meta:
ordering = ('role_plan',)
forms.py
FirstInterviewFormSet = inlineformset_factory(FirstInterview,
HiringPlan,
fk_name='first_interview',
fields=('first_interview',), extra=1)
SecondInterviewFormSet = inlineformset_factory(SecondInterview,
HiringPlan,
fk_name='second_interview',
fields=('second_interview',), extra=1)
ThirdInterviewFormSet = inlineformset_factory(ThirdInterview,
HiringPlan,
fk_name='third_interview',
fields=('third_interview',), extra=1)
OfferFormSet = inlineformset_factory(Offer, HiringPlan,
fk_name='offer', fields=('offer',),
extra=1)
AcceptedFormSet = inlineformset_factory(Accepted, HiringPlan,
fk_name='accepted', fields= .
('accepted',), extra=1)
WithdrawnFormSet = inlineformset_factory(Withdrawn, HiringPlan,
fk_name='withdrawn', fields= .
('withdrawn',), extra=1)
# https://micropyramid.com/blog/how-to-use-nested-formsets-in-
django/class
BaseChildFormset(BaseInlineFormSet):
pass
def add_fields(self, form, index):
super(BaseChildFormset, self).add_fields(form, index)
# save the formset in the 'nested' property
form.nested = FirstInterview(
instance=form.instance,
data=form.data if form.is_bound else None,
files=form.files if form.is_bound else None,
prefix='YYY-MM-YY' % (
form.prefix,
FirstInterview.get_default_prefix()),
extra=1)