Saya mencari strategi untuk memvalidasi keunikan kunci dari empat model yang memiliki hubungan satu sama lain sebelum akhirnya dapat menyimpannya di database.

Dengan kata lain, saya ingin memeriksa keunikan kunci sehingga tidak ada inkonsistensi dalam database saat menggunakan metode Model.save(), dan hanya menggunakannya ketika semua kunci unik benar-benar unik.

Mengikuti tampilan di bawah sebagai contoh, bidang cnpj, address, dan number masing-masing di LegalPerson, Email dan Phone, harus unik.

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)

Saya telah meneliti, dan menemukan bahwa model dalam Django memiliki beberapa metode validasi seperti Model.full_clean(), Model.clean(), dan Model.validate_unique().

0
mdcg 18 Agustus 2017, 17:21

2 jawaban

Jawaban Terbaik

Alih-alih menggunakan formulir biasa, Anda harus membuat beberapa formulir model.

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

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

Kemudian, gunakan formulir model Anda di tampilan dan template Anda. Bentuk model akan menangani validasi kendala unik.

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)

Perhatikan bahwa Anda dapat mengecualikan bidang kunci asing dalam formulir model. Kemudian, dalam tampilan, Anda dapat menyimpan dengan commit=False, mengatur kunci asing, lalu menyimpan instance.

Perhatikan juga bahwa kami hanya membuat instance formulir kosong AddressForm() dan LegalPersonForm di blok else (untuk permintaan GET). Ini berarti bahwa jika formulir itu valid, Anda akan melihat kesalahan formulir di Templat, bukan formulir kosong.

1
Alasdair 18 Agustus 2017, 16:22

Anda dapat merujuk ke ini di sini untuk mengatur bidang yang unik.

https://docs.djangoproject.com/en/1.11/ref/models/fields/#unique

0
Sayok88 18 Agustus 2017, 14:48