2017-08-18 6 views
0

私は最終的にデータベースに保存する前に、お互いに関係のある4つのモデルのキーの一意性を検証するための戦略を探しています。複数のモデルが同じビューで検証されています - Django 1.11

つまり、Model.save()メソッドを使用しているときにデータベースに矛盾がないように、キーの一意性をチェックして、すべての固有キーが本当に一意である場合にのみ使用します。

例として以下の図に続いて、フィールドCNPJアドレス、及びLegalPersonEmailPhoneにそれぞれは、一意である必要があります。

class StoreRegistrationView(View): 
    ''' 
    Classe responsavel pelo cadastro de lojas 
    ''' 
    def post(self, request): 

     if request.method == 'POST': 
      #import pdb; pdb.set_trace() 
      form = StoreForm(request.POST) 

      if form.is_valid(): 

       lp = LegalPerson(
        cnpj = form.cleaned_data['cnpj'], 
        corporate_name = form.cleaned_data['corporate_name'], 
        fantasy_name = form.cleaned_data['fantasy_name'], 
        state_inscription = form.cleaned_data['state_inscription'], 
        municipal_inscription = form.cleaned_data['municipal_inscription'], 
        ) 

       lp.save() 

       address = Address(
        street = form.cleaned_data['street'], 
        neighborhood = form.cleaned_data['neighborhood'], 
        number = form.cleaned_data['number'], 
        complement = form.cleaned_data['complement'], 
        city = form.cleaned_data['city'], 
        estate = form.cleaned_data['estate'], 
        country = 'Brasil', 
        cep = form.cleaned_data['cep'], 
        latitude = form.cleaned_data['latitude'], 
        longitude = form.cleaned_data['longitude'], 
        person = lp, 
        ) 

       address.save() 

       email = Email(
        address = form.cleaned_data['email'], 
        person=lp, 
        ) 

       email.save() 

       phone = Phone(
        number=form.cleaned_data['phone_number'], 
        person=lp, 
        ) 

       phone.save() 

       # Mensagem de sucesso que será disponibilizada para o usuário 
       messages.success(request, 'Cadastro de loja efetuado com sucesso.') 

       return redirect('importar-produtos') 

     messages.warning(request, 'Erro durante o cadastro.') 
     context = { 
      'store_form': StoreForm(), 
       } 

     return render(request, 'n3oadmin/store-registration.html', context) 

私が研究、とDjangoでモデルがModel.full_clean()Model.clean()、およびModel.validate_unique()のようないくつかの検証方法を持っていることがわかってきました。

答えて

1

代わりの定期的なフォームを使用して、あなたは、複数のモデルのフォームを作成する必要があります。

class LegalPersonForm(forms.ModelForm): 
    class Meta: 
     model = LegalPerson 
     fields = [...] 

class = AddressForm(forms.ModelForm): 
    class Meta: 
     model = LegalPerson 
     exclude = ['person'] 

次に、ビューとテンプレートでモデルフォームを使用します。モデルフォームは、固有の制約の検証を行います。

if request.method == 'POST': 
    address_form = AddressForm(request.POST) 
    legal_person_form = LegalPersonForm(request.POST) 

    if address_form.is_valid() and legal_person_form.is_valid(): 
     person = legal_person_form.save() 
     address = address_form.save(commit=False) 
     address.person = person 
     address.save() 

     ... 

     return redirect('importar-produtos') 
else: 
    address_form = AddressForm() 
    legal_person_form = LegalPersonForm() 

context = { 
    'address_form': address_form, 
    'legal_person_form': legal_person_form, 
} 
return render(request, 'n3oadmin/store-registration.html', context) 

注意モデルフォームで外部キーフィールドを除外できます。次に、ビューでは、commit=Falseで保存し、外部キーを設定してからインスタンスを保存します。

また、elseブロック(GET要求の場合)にブランクフォームAddressForm()LegalPersonFormがインスタンス化されていることにも注意してください。これは、フォームが有効な場合は、空白のフォームの代わりにテンプレートのフォームのエラーを表示することを意味します。

関連する問題