inlineformset_factory仅保存第一个表单

时间:2018-07-06 13:40:50

标签: python django django-forms

如标题中所述,我的表单集仅保存第一个传递的“值”。用户添加的表单没有在数据库中保存其值。

models.py

class Solicitacao(models.Model):
ROLE_CHOICES = (
    (1, 'Aberta'),
    (2, 'Fechada'),
)
aberta_fechada = models.PositiveSmallIntegerField('Status da Solicitação', choices=ROLE_CHOICES, default='Aberta'),
data_emissao = models.DateTimeField(auto_now_add=True)
descricao_solicitacao = models.CharField('Descrição da Solicitacao', max_length=255)
numero_descricao = models.CharField(default=numero_solicitacao, max_length=255)
movimentacao_relacionamento = models.ForeignKey(Movimentacao, on_delete=models.CASCADE)
departamento_relacionamento = models.ForeignKey(Departamento, on_delete=models.CASCADE)

class Meta:
    verbose_name = 'Solicitação'
    verbose_name_plural = 'Solicitações'

def __str__(self):
    return self.descricao_solicitacao


class Unidade(models.Model):
UNIDADE_CHOICES = (
    ('M²', 'm²'),
    ('KG', 'kg'),
    ('UN', 'un'),
    ('M', 'm'),
    ('CM', 'cm'),
    ('MM', 'mm'),
)
tipo_unidade = models.CharField('Tipo de Unidade', choices=UNIDADE_CHOICES, max_length=255, blank=True, null=True)
unidade_descricao = models.CharField('Descrição Unidade', max_length=255, null=True, blank=True)

class Meta:
    verbose_name = 'Unidade'
    verbose_name_plural = 'Unidades'

def __str__(self):
    return str(self.tipo_unidade)

class Materiais(models.Model):
descricao_material = models.CharField('Descrição do Material', max_length=255)

class Materiais_Solicitacao(models.Model):
descricao_material = models.CharField('Descrição do Material', max_length=255, null=True, blank=True)
quantidade_material = models.FloatField('Quantidade de Material', null=False, blank=False)
relacionamento_materiais = models.ForeignKey(Materiais, 'Relacionamento com Materiais')
relacionamento_solicitacao = models.ForeignKey(Solicitacao, 'Relacionamento com Solicitacao')
unidade_relacionamento = models.ForeignKey(Unidade, 'Relacionamento com a unidade')

class Meta:
    verbose_name = 'Material da Solicitação'
    verbose_name_plural = 'Material das Solicitações'

def __str__(self):
    return str(self.relacionamento_materiais)

class Meta:
    verbose_name = 'Material'
    verbose_name_plural = 'Materiais'

def __str__(self):
    return self.descricao_material

views.py

class SolicitacaoCreate(LoginRequiredMixin, CreateView):
model = Solicitacao
context_object_name = 'solicitacao_list'
template_name = 'solicitacao/solicitacao_create1.html'
form_class = SolicitacaoForm
success_url = reverse_lazy('home')

def get_context_data(self, **kwargs):
    data = super(SolicitacaoCreate, self).get_context_data(**kwargs)
    if self.request.POST:
        data['materiais'] = MateriaisFormSet(self.request.POST)
    else:
        data['materiais'] = MateriaisFormSet()
    return data

def form_valid(self, form):
    context = self.get_context_data()
    materiais = context['materiais']
    with transaction.atomic():
        if form.is_valid():
            self.object = form.save()
            self.object.usuarios = self.request.user
            self.object.save()
        if materiais.is_valid():
            materiais.instance = self.object
            materiais.save()
    return super(SolicitacaoCreate, self).form_valid(form)

forms.py

class SolicitacaoForm(forms.ModelForm):

class Meta:
    model = Solicitacao
    fields = [
        'descricao_solicitacao',
        'movimentacao_relacionamento',
        'departamento_relacionamento',
    ]


class Material_SolicitacaoForm(forms.ModelForm):

class Meta:
    model = Materiais_Solicitacao
    fields = [
        'quantidade_material',
        'descricao_material',
        'unidade_relacionamento',
    ]


MateriaisFormSet = inlineformset_factory(Solicitacao, Materiais_Solicitacao, fields=('quantidade_material', 'descricao_material', 'unidade_relacionamento', 'relacionamento_materiais'), extra=1)

一些印刷品可以更好地理解。

通过添加项目并保存请求来

“用户”

enter image description here

数据库中只有一项。

enter image description here

我认为这可能是某些事情,但是在Google上查看某些帖子并没有发现有帮助/有用的东西。

感谢您的帮助。谢谢!对不起,英语不好 :P

0 个答案:

没有答案