首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适用于管理员和员工的Django Models Clean方法

适用于管理员和员工的Django Models Clean方法
EN

Stack Overflow用户
提问于 2018-09-27 01:19:13
回答 2查看 290关注 0票数 0

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

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

代码语言:javascript
复制
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')

我试过了,但它没有捕捉到错误,它只是保存到数据库中:

代码语言:javascript
复制
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!')})

我有这个保存函数:

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2018-09-27 02:35:42

正如Django Document所说:

但是,请注意,与Model.full_clean()一样,当您调用模型的

()方法时,不会调用模型的clean()方法。

所以clean_parking_off方法也是如此。你必须在保存方法中调用它,这也需要将request传递给保存方法,这不是一个好方法。

你可以从另一个方面看到这个问题,如果你使用的是管理面板,这个验证可以通过覆盖save_model来完成,因为你可以看到here,在视图中你也可以访问request.user

票数 0
EN

Stack Overflow用户

发布于 2018-09-28 20:25:38

它是这样工作的:

代码语言:javascript
复制
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
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52523074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档