Экземпляр дочерней формы в Django

В проекте по созданию списка контактов я не смог передать экземпляр профиля контакта в форму списка телефонов. Когда я хочу добавить несколько телефонных номеров к человеку, мне нужно, чтобы экземпляр человека был загружен в форму добавления телефона.

models.py

class newuser(forms.ModelForm):
    class Meta:
        model= contact_names
        fields='__all__'
        
class newphone(forms.ModelForm):
    class Meta:
        model=contact_phone
        fields=['person','typep','phone']

views.py

def user(request):
    form=newuser()
    if request.method =='POST':
        form=newuser(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return redirect('contacts')
    return render(request,'apptwo/form_page.html',{'form':form})

def addphone(request,pk):
    ps=contact_names.objects.get(id=pk)
    form=newphone(instance=ps)
    if request.method =='POST':
        form=newphone(request.POST)
        if form.is_valid():
            form.save(commit=True)
            return redirect('contacts')
    return render(request,'apptwo/form_page2.html',{'form':form})

forms.py

class newuser(forms.ModelForm):
    class Meta:
        model= contact_names
       
        fields='__all__'
        
class newphone(forms.ModelForm):
    class Meta:
        model=contact_phone
        fields=['person','typep','phone']

Похоже, вы пытаетесь создать форму телефонного номера, связанную с определенным профилем контакта. В представлении addphone вы правильно получаете профиль контакта из базы данных, используя первичный ключ (pk), переданный через URL, но в части POST представления вы создаете новую форму без передачи экземпляра профиля контакта, который вы получили ранее.

Чтобы исправить это, необходимо обновить часть POST представления addphone, чтобы использовать экземпляр профиля контакта при создании формы номера телефона:

if request.method =='POST':
form=newphone(request.POST,instance=ps)
if form.is_valid():
    form.save(commit=True)
    return redirect('contacts')

Кроме того, в вашей форме вы должны определить внешний ключ для person и он должен быть скрыт в форме,

class newphone(forms.ModelForm):
person = forms.ModelChoiceField(queryset=contact_names.objects.all(), widget=forms.HiddenInput())
class Meta:
    model=contact_phone
    fields=['person','typep','phone']

Таким образом, когда вы сохраните форму, внешний ключ person будет автоматически установлен на экземпляр контакта, который вы передали.

Я нашел способ, но с небольшими проблемами. По-прежнему, когда я хочу добавить первый телефон конкретному человеку, выпадающий список персон отображается как '------', в форме по умолчанию, но экземпляр в порядке. И когда я хочу добавить новый второй телефон, поле телефона в форме не пустое. Я буду очень рад, если кто-нибудь мне поможет. Я благодарен за размещенный ответ, он помог, но не решил проблему полностью.

views.py

def addphone(request,pk):
ps=contact_names.objects.filter(id=pk)
for s in ps:
    pd=s.contact_phone_set.all()
    
if pd.first()== None:
    form=newphone(instance=s)
    form.fields['person'].queryset=ps
else:
    form=newphone(instance=pd.last())
    form.fields['phone'].queryset=None # <------This has no effect!

if request.method =='POST':
    form=newphone(request.POST)
    if form.is_valid():
        form.save(commit=True)
        return redirect('contacts')
return render(request,'apptwo/form_page2.html',{'form':form})enter code here

forms.py

class newphone(forms.ModelForm):
# person = forms.ModelChoiceField(queryset=contact_names.objects.all(), widget=forms.HiddenInput())# #THis didn't Help Since the field is required. 
class Meta:
    model=contact_phone
    p_type=(
    ('Fixed Phone','Fixed Phone'),
     ('Cell Phone','Cell Phone'),)

    fields=['person','typep','phone']
    labels = {
        'typep': '',
    }
    widgets = {
        'typep': forms.RadioSelect(choices=p_type)
    }
Вернуться на верх