Django - 针对不同用户的自定义验证

时间:2014-04-04 04:13:10

标签: django django-models django-admin

我有一个名为bk_time的日期时间字段。现在,我想基于不同的用户为bk_time编写自定义验证。

例如,我有用户Staff_AStaff_BSuperuser

  1. Staff_A只能设置时间=周一至周五上午9点至凌晨12点
  2. Staff_B只能设置时间=仅限星期一
  3. Superuser没有限制
  4. 我已提到Django Doc Validators。但它似乎不适用于多重验证

    我曾尝试撰写save_formset Django Doc Admin。但似乎无法提出ValidationError

    models.py

    class Location(models.Model):
        name = models.CharField('Location', max_length=100)
    
    class Room(models.Model):
        room_label = models.CharField('Room Lebel', max_length=100)
        bk_time= models.DateTimeField('Booking Time')
    

    admin.py

    class RoomInline(admin.StackedInline):
        model = Room
        extra = 0
    
    class LocationAdmin(admin.ModelAdmin):
        list_display = ['id', 'name']
        fields = ('name')
        inlines = [RoomInline]
    

    如果这是相关的,我使用Django 1.4。

1 个答案:

答案 0 :(得分:0)

我认为这必须在表单验证上进行,而不是在字段验证上。这是因为您的验证取决于两个独立的字段。

特别是,这与身份验证非常相似:您的验证取决于用户和其他字段。看看Django如何实现其身份验证(来自django.contrib.auth):

class AuthenticationForm(forms.Form):
    [...]
    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if username and password:
            self.user_cache = authenticate(username=username,
                                           password=password)
            if self.user_cache is None:
                raise forms.ValidationError(
                    self.error_messages['invalid_login'],
                    code='invalid_login',
                    params={'username': self.username_field.verbose_name},
                )
            elif not self.user_cache.is_active:
                raise forms.ValidationError(
                    self.error_messages['inactive'],
                    code='inactive',
                )
        return self.cleaned_data

在您的情况下,您希望在给定约束上引发ValidationError,否则返回cleaning_data。