管理员和职员用户的Django模型清理方法

时间:2018-09-26 17:19:13

标签: django

我有一个任务,需要为这个问题写一个解决方案。

具有2个字段parking_on和parking_off。如果用户是职员用户,则parking_off日期必须与parking_on相同;如果用户是admin,则parking_off的日期可以与parking_on的日期不同。

class Parking(models.Model):
parking_on = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True,
                                  help_text='Alege data cand doresti sa vii in office',)
parking_off = models.DateField(auto_now=False, auto_now_add=False, blank=True, null=True,
                                   help_text='Alege Data Plecarii')

尝试过此方法,但没有捕获到错误,只是将其保存到数据库中

def clean_parking_off(self, request):
    if not request.user.is_superuser and self.parking_off !=self.parking_on:
        raise ValidationError(
            {'parking_off': _('You cant book for a future date!')})

我有此保存功能:

def save(self):
    list = []
    d = self.parking_on
    while d <= self.parking_off:
        list.append(
            Parking(user=self.user,
                    email=self.email,
                    parking_on=d,
                    parking_off=d,
                    location=self.location
                    )
        )
        d = d + timedelta(days=1)
    Parking.objects.bulk_create(list)

2 个答案:

答案 0 :(得分:0)

Django Document说:

  

但是请注意,就像Model.full_clean()一样,调用模型的save()方法时不会调用模型的clean()方法。

您的clean_parking_off方法也是如此。您必须在save方法中调用它,该方法也需要通过request来保存方法,巫婆不是一个好方法。

您可以从另一面看到此问题,如果您正在使用管理面板,则可以通过覆盖save_model来完成此验证,因为您可以看到here,并且在视图中可以访问{{1} }。

答案 1 :(得分:0)

它与此配合使用:

ASA SE FILTREAZA ELEMENTE IN FUNCTIE DE user
def remove_from_fieldsets(fieldsets, fields):
        for fieldset in fieldsets:
            for field in fields:
                if field in fieldset[1]['fields']:
                    new_fields = []
                    for new_field in fieldset[1]['fields']:
                        if not new_field in fields:
                            new_fields.append(new_field)

                    fieldset[1]['fields'] = tuple(new_fields)
                    break
   def get_fieldsets(self, request, obj=None):
       fieldsets = super(ParkingModelAdmin, self).get_fieldsets(request, obj)

    if not request.user.is_superuser:
        remove_from_fieldsets(fieldsets, ('parking_off',))

    return fieldsets