Tetapkan nilai bidang model yang bukan bagian dari bentuk model

Saya punya model seperti ini

class Income(models.Model):
    value = models.DecimalField(max_digits=10, decimal_places=2)
    remitted = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)

Saya memiliki formulir seperti ini

class EditIncomeForm(forms.ModelForm):
    class Meta:
        model = Income
        fields = ("value", )

        def clean_value(self):
           value = self.cleaned_data["value"]
            if self.value < self.remitted:
                raise forms.ValidationError("Error message")
            return value

Sekarang di modelform, bagaimana cara memperbarui nilai bidang remitted? Sepertinya saya tidak dapat mengakses bidang remitted dengan cara ini. Saya menggunakan Django 2.0


person chidimo    schedule 15.02.2018    source sumber


Jawaban (2)


Ini tidak ada hubungannya dengan apakah bidang tersebut ada di formulir atau tidak.

Anda melakukan dua hal yang salah; pertama, Anda mencoba mengakses self.remitted bukannya self.cleaned_data['remitted']; dan kedua, remitted tidak akan dibersihkan pada saat clean_value dipanggil.

Untuk mengakses data dari beberapa bidang, ganti metode clean() utama:

 def clean(self):
      value = self.cleaned_data["value"]
      remitted = self.cleaned_data["remitted"]
      if value < remitted:
          self.add_error("value", "Error message")
person Daniel Roseman    schedule 15.02.2018
comment
seperti yang saya pahami, remitted tidak ada dalam data bersih - person Brown Bear; 15.02.2018
comment
Apa yang membuatmu berpikir demikian? - person Daniel Roseman; 15.02.2018
comment
Tapi itu tidak ada hubungannya dengan apa yang ada di data_bersih, itu hanya menentukan bidang apa yang disimpan ke instance. - person Daniel Roseman; 15.02.2018
comment
o terima kasih, pikiran saya bingung dengan serializer drf - person Brown Bear; 15.02.2018
comment
@DanielRoseman Saya akan mencobanya ketika saya punya waktu. Tapi satu pertanyaan. Apakah saya secara khusus harus menggunakan self.add_error("value", "Error message") atau saya harus menggunakan forms.ValidationError? - person chidimo; 15.02.2018
comment
Dalam metode pembersihan umum, memunculkan ValidationError akan menyebabkannya tidak dikaitkan dengan bidang tertentu, sehingga akan ditampilkan di form.non_field_errors. Itu tergantung pada apakah itu penting bagi Anda. - person Daniel Roseman; 15.02.2018
comment
@DanielRoseman Saya menambahkan kesalahan ke bidang 'nilai' di formulir. Pertanyaannya sekarang adalah bagaimana cara memunculkan kesalahan pada template untuk memperingatkan pengguna bahwa ada sesuatu yang salah. - person chidimo; 15.02.2018
comment
@Bear Brown Saya rasa kita berdua telah mempelajari sesuatu yang baru hari ini tentang pembersihan bidang formulir. Bersulang - person chidimo; 15.02.2018
comment
Oke. Saya menggunakan {{ form.errors }} dan itu tidak muncul sebagai tambahan. Bisakah Anda memberi saran tentang cara membaca Django'dan kode sumber? - person chidimo; 15.02.2018
comment
Jika kesalahan tidak muncul, berarti ada yang salah dengan tampilan dan/atau template Anda; Anda harus mempostingnya. - person Daniel Roseman; 15.02.2018
comment
Bentuk model tidak memanggil metode clean(). Ada ide. - person chidimo; 15.02.2018

Saya membaca tentang Validasi pada ModelForm dari dokumen dan akhirnya saya bisa memunculkan kesalahan di formulir. Kode formulir lengkap di bawah ini.

Bagian ini secara khusus terbukti untuk menjadi apa yang saya butuhkan. Ia mengatakan:

Contoh bentuk model yang melekat pada objek model akan berisi atribut contoh yang memberikan metode akses ke contoh model tertentu.

class EditIncomeForm(forms.ModelForm):
    class Meta:
        model = Income
        fields = ("value", )

    def clean(self):
        value = self.cleaned_data['value']
        remitted = self.instance.remitted # access other model field.
        if value <= remitted:
            self.add_error("value", "Error message.")
person chidimo    schedule 15.02.2018