Django中如何将信息保存在两个不同的表中?

问题描述 投票:0回答:1

我有一个 django 应用程序,我可以在其中打开一个包含呈现的字段(客户端和服务)(表单)的表单,并将其保存在单个表中。

我决定将客户数据分离到另一个表中,以免同一个客户在 services 表中保存多次。

事实证明我不知道如何将这个推理应用到实践中。

下面是负责 n 的视图

新注册。

@login_required
def NovaOS(request):
    if request.method == 'POST':
        form = OrdemServicoForm(request.POST)

        if form.is_valid():
            OS = form.save(commit=False)
            OS.user = request.user
            OS.save()
            return redirect('/os/list/')
    else:
        form = OrdemServicoForm()
        return render(request, 'serviceorders/addos.html', {'form': form})

我已经在 forms.py 和 models.py 中创建了必要的信息。

表格.py

class ClienteForm(forms.ModelForm):
    class Meta:
        model = Clientes
        fields = '__all__'
        widgets = { #Dados do cliente
                    'STATUSCliente':                forms.Select(attrs={'class': 'form-control', 'placeholder': 'Status'}),
                    'cliente_razaosocial':          forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Razão Social', 'autofocus': True}),
                    'cliente_cpfcnpj':              forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'CPF/CNPJ'}),
                    'cliente_rgie':                 forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'RG/I.E.'}),
                    'cliente_email':                forms.EmailInput(attrs={'class': 'form-control', 'placeholder': 'E-mail'}),
                    'cliente_telefone_fixo':        forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Tel. fixo', 'data-mask':"(00)0000-0000"}),
                    'cliente_telefone_celular':     forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Tel. celular', 'data-mask':"(00)00000-0000"}),
                    'cliente_endereco':             forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Endereço'}),
                    'cliente_endereco_num':         forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Número'}), 
                    'cliente_endereco_CEP':         forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'CEP'}),
                    'cliente_endereco_Bairro':      forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Bairro'}),
                    'cliente_endereco_Cidade':      forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Cidade'}),
                    'cliente_endereco_UF':          forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'UF'}),
                    'cliente_endereco_Complemento': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'Complemento'}),

        }

        labels = {
            'cliente_razaosocial': 'Nome/Razão social:',
            'cliente_cpfcnpj': 'CPF/CNPJ:',
            'cliente_rgie': 'RG/IE:',
            'cliente_email': 'E-mail:',
            'cliente_telefone_fixo': 'Fixo:',
            'cliente_telefone_celular': 'Celular:',
            'cliente_endereco': 'Endereço:',
            'cliente_endereco_num': 'Num:',
            'cliente_endereco_Complemento': 'Complemento:',
            'cliente_endereco_CEP': 'CEP:',
            'cliente_endereco_Bairro': 'Bairro:',
            'cliente_endereco_Cidade': 'Cidade:',
            'cliente_endereco_UF': 'UF:',

模型.py

class Clientes(models.Model):
    STATUSCliente = (
        ('Ativo', 'Ativo'),        
        ('Inativo', 'Inativo'),
    )

    #Dados Cliente
    cliente_razaosocial          = models.CharField(max_length=100)
    cliente_cpfcnpj              = models.CharField(max_length=20)
    cliente_rgie                 = models.CharField(max_length=20)
    cliente_email                = models.CharField(max_length=50)
    cliente_telefone_fixo        = models.CharField(max_length=20)
    cliente_telefone_celular     = models.CharField(max_length=20)
    cliente_endereco             = models.CharField(max_length=100)
    cliente_endereco_num         = models.CharField(max_length=10)
    cliente_endereco_CEP         = models.CharField(max_length=10)
    cliente_endereco_Bairro      = models.CharField(max_length=30)
    cliente_endereco_Cidade      = models.CharField(max_length=30)
    cliente_endereco_UF          = models.CharField(max_length=20)
    cliente_endereco_Complemento = models.CharField(max_length=50)  

    def __str__(self):
        return self.cliente_razaosocial

当我在 NovaOS 视图中更改它时:

 else:
        form = OrdemServicoForm()
        return render(request, 'serviceorders/addos.html', {'form': form})

对于:

else:
        form = ClienteForm()
        return render(request, 'serviceorders/addos.html', {'form': form})

这些字段出现在表单上,但之前的字段消失。

如果客户和服务订单都不存在,那么在实践中将两个表中的字段都放在屏幕上并将它们保存在两个表中会是什么样子?如果客户已经存在,只需保存带有客户 ID 的服务订单即可?

提前非常感谢您!

我已经尝试过改变视图,但还没有找到合理的解决方案。

django django-models django-rest-framework django-views django-forms
1个回答
0
投票

您可以探索表单集来管理多个模态表单

 # models.py
from django.db import models

class FirstModel(models.Model):
    # Your FirstModel fields go here

class SecondModel(models.Model):
    # Your SecondModel fields go here

# forms.py
from django import forms
from .models import FirstModel, SecondModel

class FirstModelForm(forms.ModelForm):
    class Meta:
        model = FirstModel
        # Your FirstModel form fields go here

class SecondModelForm(forms.ModelForm):
    class Meta:
        model = SecondModel
        # Your SecondModel form fields go here

# views.py
from django.shortcuts import render
from django.forms import modelformset_factory
from .models import FirstModel, SecondModel
from .forms import FirstModelForm, SecondModelForm

def manage_multiple_forms(request):
    FirstModelFormSet = modelformset_factory(FirstModel, form=FirstModelForm, extra=1)
    SecondModelFormSet = modelformset_factory(SecondModel, form=SecondModelForm, extra=1)

    if request.method == 'POST':
        first_model_formset = FirstModelFormSet(request.POST, prefix='first_model')
        second_model_formset = SecondModelFormSet(request.POST, prefix='second_model')

        if first_model_formset.is_valid() and second_model_formset.is_valid():
            # Save your forms or perform other actions
            first_model_formset.save()
            second_model_formset.save()
    else:
        first_model_formset = FirstModelFormSet(queryset=FirstModel.objects.none(), prefix='first_model')
        second_model_formset = SecondModelFormSet(queryset=SecondModel.objects.none(), prefix='second_model')

    return render(request, 'your_template.html', {
        'first_model_formset': first_model_formset,
        'second_model_formset': second_model_formset,
    })
© www.soinside.com 2019 - 2024. All rights reserved.