Как создать подчиненную форму для ManyToMany с промежуточной таблицей, используя формы Django? - PullRequest
0 голосов
/ 10 февраля 2020

код здесь выглядит действительно хорошо и полезно, но что, если я хочу ManyToMany с использованием промежуточной таблицы?

У меня есть Person и Phone, и у человека может быть много телефонов, и телефон может быть связан со многими людьми. Таким образом, у меня есть промежуточная таблица PersonPhone.

class PersonPhone(BaseModel):
    person = models.ForeignKey(Person, on_delete=models.CASCADE,
                               blank=False, null=False)
    phone_type = models.ForeignKey(PhoneType, models.CASCADE,
                                   blank=False, null=False)
    phone = models.ForeignKey(Phone, on_delete=models.CASCADE,
                              blank=False, null=False)

Я создал код, вдохновленный ответом выше, с PersonPhone. Но форма просит меня выбрать уже существующий телефон. Я хотел бы добавить возможность динамически создавать новый Phone.


PersonPhoneForm

class PersonPhoneForm(forms.ModelForm):
    class Meta:
        model = PersonPhone
        fields = ('phone_type', 'phone')


PersonPhoneFormSet = inlineformset_factory(Person, PersonPhone,
                                           form=PersonPhoneForm, extra=1)

PersonPhonesCreate view

class PersonPhonesCreate(generic.CreateView):
    template_name = 'person_phones.html'
    model = Person
    fields = '__all__'
    success_url = reverse_lazy('profile-list')

    def __init__(self, **kwargs):
        self.object = None
        super().__init__(**kwargs)

    def get_context_data(self, **kwargs):
        result = super().get_context_data(**kwargs)
        if self.request.POST:
            result['person_phones'] = PersonPhoneFormSet(self.request.POST)
        else:
            result['person_phones'] = PersonPhoneFormSet()
        return result

    def form_valid(self, form):
        context = self.get_context_data()
        person_phones = context['person_phones']
        with transaction.atomic():
            self.object = form.save()

            if person_phones.is_valid():
                person_phones.instance = self.object
                person_phones.save()
        return super().form_valid(form)

Как бы вы поступили?

...