簡體   English   中英

如何將內聯表單集保存在另一個中?

[英]How to save an Inline Formset inside another?

我有以下情況:我要創建一個項目,在這個項目中我可以有多個實習,每個實習我可以有多個實習生。 我能夠創建並保存實習,但我找不到創建實習生的方法。 有沒有辦法這樣做?

這是我的代碼:

視圖.py

def cadastrar_bolsa(request, projeto_id):
if request.method == 'GET':
    projeto_editar = Projeto.objects.filter(id=projeto_id).first()
    if projeto_editar is None:
        return redirect(reverse('projeto'))
    form = EditForm(instance=projeto_editar)

    form_bolsa_factory = inlineformset_factory(Projeto, Bolsa, form=BolsaForm, extra=1)
    form_bolsa = form_bolsa_factory(instance=projeto_editar)

    form_bolsista_factory = inlineformset_factory(Bolsa, Bolsista, form=BolsistaForm, extra=1)
    form_bolsista = form_bolsista_factory(instance=????)

    context = {
        'form': form,
        'form_bolsa': form_bolsa,
        'form_bolsista': form_bolsista,
        'id': projeto_id,
    }
    return render(request, 'cadastrar_bolsa.html', context)
elif request.method == 'POST':
    projeto_editar = Projeto.objects.filter(id=projeto_id).first()
    if projeto_editar is None:
        return redirect(reverse('projeto'))
    form = EditForm(request.POST, instance=projeto_editar)

    form_bolsa_factory = inlineformset_factory(Projeto, Bolsa, form=BolsaForm, extra=1)
    form_bolsa = form_bolsa_factory(request.POST, instance=projeto_editar)

    form_bolsista_factory = inlineformset_factory(Bolsa, Bolsista, form=BolsistaForm, extra=1)
    form_bolsista = form_bolsista_factory(instance=????)

    if form.is_valid() and form_bolsa.is_valid():
        projeto_editado = form.save()
        form_bolsa.instance = projeto_editado
        form_bolsa.save()
        ?????
        return redirect('bolsas', projeto_id)
    else:
        context = {
            'form': form,
            'form_bolsa': form_bolsa,
            'form_bolsista': form_bolsista,
            'id': projeto_id,
        }
        return render(request, 'cadastrar_bolsa.html', context)

模型.py

class Projeto(models.Model):

    nome_projeto = models.CharField('Nome do Projeto', max_length=200)
    data_de_inicio = models.DateField('Data de Inicio')
    data_de_fim = models.DateField('Data de Termino')
    objetivo_projeto = models.TextField('Objetivo do Projeto', max_length=800)

    def __str__(self):
        return self.nome_projeto

class Bolsa(models.Model):
    projeto = models.ForeignKey(Projeto, on_delete=models.CASCADE, related_name='bolsas')
    orgao_remunerador = models.CharField(max_length=50, blank=True)

    def __str__(self):
        return self.orgao_remunerador


class Bolsista(models.Model):
    bolsa = models.ForeignKey(Bolsa, on_delete=models.CASCADE, related_name='bolsistas')
    bolsista = models.CharField('Nome', max_length=200, blank=True)
    email = models.EmailField(max_length=200, blank=True)

    def __str__(self):
        return self.bolsista

forms.py

    class EditForm(forms.ModelForm):
    format_key = 'DATE_INPUT_FORMATS'

    class Meta:
        model = Projeto
        fields = '__all__'

    nome_projeto = forms.CharField(label='Nome do Projeto:', required=True, widget=forms.TextInput(
        attrs={
            'class': 'form-control col-8',
            'maxlength': '200',
        }
    ))

    data_de_inicio = forms.DateField(label='Data de Inicio:', required=True, widget=forms.DateInput(
        attrs={
            'type': 'date',
            'date-input': 'date',
            'class': 'form-control col-4',
            'format': '%d-%m-%Y',
            'value': '{{data_de_inicio|date:"d-m-Y"}}'
        }
    ))

    data_de_fim = forms.DateField(label='Data de Término:', required=True, widget=forms.DateInput(
        attrs={
            'type': 'date',
            'class': 'form-control col-4',
            'format': '%d-%m-%Y'
        }
    ))

    objetivo_projeto = forms.CharField(label='Objetivos do Projeto:', required=True, widget=forms.Textarea(
        attrs={
            'type': 'text',
            'class': 'form-control col-8',
            'maxlength': '800'
        }
    ))

class BolsistaForm(forms.ModelForm):
    class Meta:
        model = Bolsista
        fields = '__all__'

    bolsista = forms.CharField(label="Bolsista do Projeto", widget=forms.TextInput(
        attrs={
            'class': 'form-control col-7',
            'maxlength': '200',
        }
    ))

    email = forms.EmailField(label='E-mail', required=True, widget=forms.EmailInput(
        attrs={
            'class': 'form-control col-7',
            'maxlength': '200',
            'placeholder': "Ex.: jose@unemat.br",
            'name': 'email'
        }
    ))


class BolsaForm(forms.ModelForm):
    class Meta:
        model = Bolsa
        fields = '__all__'

    orgao_remunerador = forms.CharField(label="Qual o orgão remunerador?", widget=forms.TextInput(
        attrs={
            'class': 'form-control col-8',
            'maxlength': '200',
        }
    ))

我已經在我找不到解決方法的部分上打上了問號。

在您的獲取部分中,您只需要為 Bolsista 返回一個空表格,因為如果我理解正確,您將添加一個新的實習生。 所以..

if request.method == 'GET':
    ...
    form_bolsista = Bolsista()

然后在您的帖子部分中刪除form_bolsista = form_bolsista_factory(instance=????)

保存 projeto_editado 和 bolsa 之后。 添加以下內容以將實習生添加到bolsa。

bolsista = Bolsista(request.POST)
new_bolsista = bolsista.save(commit=False) 

new_bolsista.bolsista = request.FILES.get('bolsista') 
new_bolsista.email = request.FILES.get('email')
new_bolsista.bolsa = Bolsa.objects.filter(projecto=projeto_editar)
new_bolsista.save()
bolsista.save_m2m()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM