我正在尝试使用来自单个模型的多个外键引用创建单个表单实例。我是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)