【问题标题】:DateField bigger than most recent recordDateField 比最近的记录大
【发布时间】:2021-07-25 16:49:06
【问题描述】:

我有这个数据库表:

models.py

class Payment(models.Model):
    date = models.DateField(blank=False,verbose_name="Data")
    description = models.CharField(max_length = 300,blank=False,verbose_name="Descrizione")
    course_subscription = models.ForeignKey(CourseSubscription,null=True,on_delete=models.CASCADE,verbose_name="Sottoscrizione Corso")
    payment_method = models.CharField(max_length = 4,blank=False,verbose_name="Modalità di pagamento",choices=PAYMENTS)
    value = models.DecimalField(max_digits=7, decimal_places=2,blank=False,verbose_name="Importo")
    receipt= models.FileField(blank=False,verbose_name="Ricevuta")

如何在模型或表单中添加一个约束,仅当日期比最近的记录更新时才允许插入新的付款?换句话说,我希望新的付款总是比上次插入​​的日期更新。

我试过了:

forms.py

class AddPaymentForm(forms.Form):
    def __init__(self, max_value, min_date, *args, **kwargs):
        super(AddPaymentForm, self).__init__(*args, **kwargs)
        self.fields['value'] = forms.DecimalField(  
            max_digits=7, 
            decimal_places=2,
            required=True,
            label="Importo",
            min_value=0.01,
            max_value=max_value,
            help_text= f"Valore Massimo: {max_value}",
            widget = forms.NumberInput()
        )

        self.fields['date'] = forms.DateField(  
            required=True,
            label="Data",
            min_value=min_date,
            help_text= f"Data minima: {min_date}",
            widget=forms.TextInput(
                attrs={'type': 'date'} 
            )
        )

....

和 视图.py

...
    payments = Payment.objects.all().order_by('-date')
    initial = {
        'date': datetime.date.today().strftime("%Y-%m-%d"),
        'member':member,
        'description': description,
        'value': 1.00,
        'subscription_type' :subscription_type,
        'subscription_id'   :subscription_id   
    }
    if len(payments)>0 :
        min_date = payments[0].date.strftime("%Y-%m-%d")
        initial["date"] = min_date
    else:
        min_date = None
    form = AddPaymentForm(
        initial= initial,
        max_value = remaining_fee,
        min_date = min_date
    )
...

这种方式适用于 'value' 字段,但 forms.DateField 没有“min_value”属性。

【问题讨论】:

    标签: django django-forms datefield


    【解决方案1】:

    解决了向 AddPaymentForm 添加 clean 方法:

    class AddPaymentForm(forms.Form):
        def __init__(self, max_value, *args, **kwargs):
            super(AddPaymentForm, self).__init__(*args, **kwargs)
            self.fields['value'] = forms.DecimalField(  
                max_digits=7, 
                decimal_places=2,
                required=True,
                label="Importo",
                min_value=0.01,
                max_value=max_value,
                help_text= f"Valore Massimo: {max_value}",
                widget = forms.NumberInput()
            )
    
        def clean(self, *args, **kwargs):
            super(AddPaymentForm, self).clean(*args, **kwargs)
            payments = Payment.objects.all().order_by('-date')
            if len(payments)>0 :
                min_date = payments[0].date
            else:
                min_date = datetime.date(2020,8,1)
            form_date = self.cleaned_data.get("date")
            if form_date < min_date:
                self.add_error('date', f'La data deve essere più decente del {min_date.strftime("%d/%m/%Y")}')
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2018-09-07
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多