код здесь выглядит действительно хорошо и полезно, но что, если я хочу 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)
Как бы вы поступили?