ตั้งค่าของฟิลด์โมเดลที่ไม่ได้เป็นส่วนหนึ่งของฟอร์มโมเดล

ฉันมีโมเดลแบบนี้

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)

ฉันมีรูปแบบเช่นนี้

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

ตอนนี้อยู่ในรูปแบบโมเดล ฉันจะอัปเดตค่าของฟิลด์ remitted ได้อย่างไร ดูเหมือนว่าฉันจะไม่สามารถเข้าถึงฟิลด์ remitted ด้วยวิธีนี้ได้ ฉันใช้ Django 2.0


person chidimo    schedule 15.02.2018    source แหล่งที่มา


คำตอบ (2)


สิ่งนี้ไม่เกี่ยวอะไรกับว่าฟิลด์อยู่ในแบบฟอร์มหรือไม่

คุณกำลังทำสองสิ่งผิด ประการแรก คุณกำลังพยายามเข้าถึง self.remitted แทนที่จะเป็น self.cleaned_data['remitted']; และประการที่สอง remitted จะไม่ได้รับการทำความสะอาด ณ จุดที่เรียก clean_value

หากต้องการเข้าถึงข้อมูลจากหลายช่อง ให้แทนที่วิธีหลัก clean() แทน:

 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
ตามที่ฉันเข้าใจว่า remitted ไม่มีอยู่ในข้อมูลที่สะอาด - person Brown Bear; 15.02.2018
comment
อะไรทำให้คุณคิดอย่างนั้น? - person Daniel Roseman; 15.02.2018
comment
แต่นั่นไม่เกี่ยวอะไรกับสิ่งที่อยู่ใน cleaned_data เพียงกำหนดว่าฟิลด์ใดจะถูกบันทึกลงในอินสแตนซ์ - person Daniel Roseman; 15.02.2018
comment
โอ้ ขอบคุณ ฉันสับสนในใจกับ drf serializers - person Brown Bear; 15.02.2018
comment
@DanielRoseman ฉันจะลองดูเมื่อฉันมีเวลา แต่คำถามหนึ่ง ฉันต้องใช้ self.add_error("value", "Error message") โดยเฉพาะหรือควรใช้ forms.ValidationError - person chidimo; 15.02.2018
comment
ในวิธีการล้างข้อมูลทั่วไป การเพิ่ม ValidationError จะทำให้ไม่เชื่อมโยงกับฟิลด์ใดๆ โดยเฉพาะ ดังนั้นจะแสดงใน form.non_field_errors ขึ้นอยู่กับว่าสิ่งนั้นสำคัญกับคุณหรือไม่ - person Daniel Roseman; 15.02.2018
comment
@DanielRoseman ฉันเพิ่มข้อผิดพลาดลงในฟิลด์ 'value' ในแบบฟอร์ม คำถามคือ ฉันจะแจ้งข้อผิดพลาดในเทมเพลตได้อย่างไรเพื่อแจ้งเตือนผู้ใช้ว่ามีบางอย่างผิดปกติ - person chidimo; 15.02.2018
comment
@Bear Brown ฉันเดาว่าเราทั้งคู่ได้เรียนรู้สิ่งใหม่ในวันนี้เกี่ยวกับการทำความสะอาดแบบฟอร์ม ไชโย - person chidimo; 15.02.2018
comment
ตกลง. ฉันใช้ {{ form.errors }} แล้วมันไม่แสดงขึ้นมาเลย คุณช่วยแนะนำวิธีอ่าน Django' และซอร์สโค้ดได้ไหม - person chidimo; 15.02.2018
comment
หากข้อผิดพลาดไม่ปรากฏขึ้น แสดงว่ามีสิ่งผิดปกติเกิดขึ้นกับมุมมองและ/หรือเทมเพลตของคุณ คุณควรโพสต์ไว้ - person Daniel Roseman; 15.02.2018
comment
modelform ไม่ได้เรียกใช้เมธอด clean() ไอเดียอะไรก็ได้ - person chidimo; 15.02.2018

ฉันได้อ่านเกี่ยวกับ การตรวจสอบความถูกต้องใน ModelForm จากเอกสาร และในที่สุดฉันก็สามารถแจ้งข้อผิดพลาดในแบบฟอร์มได้ รหัสแบบฟอร์มเต็มด้านล่าง

ส่วนนี้ได้รับการพิสูจน์โดยเฉพาะ เพื่อเป็นสิ่งที่ฉันต้องการ มันบอกว่า:

อินสแตนซ์รูปแบบโมเดลที่แนบมากับวัตถุโมเดลจะมีแอตทริบิวต์อินสแตนซ์ที่ให้วิธีการเข้าถึงอินสแตนซ์โมเดลเฉพาะนั้น

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