Django多个Inlineformset_factory。以一种形式使用一个“子”模型和多个父模块

时间:2018-07-23 17:55:40

标签: python django inline-formset

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

0 个答案:

没有答案