2014-04-04 58 views
1

我有一個名爲bk_time的日期時間字段。現在,我想編寫基於不同用戶的bk_time的自定義驗證。Django - 針對不同用戶的自定義驗證

例如,我有用戶Staff_AStaff_BSuperuser

  1. Staff_A只能設置時間=週一至週五9 am-12am
  2. Staff_B只能設置時間=週一僅
  3. Superuser沒有限制

我已經提到Django Doc Validators。但似乎並不適用於多個驗證工作

我試圖寫save_formsetDjango 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。

回答

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,並返回cleaned_data否則。

+0

感謝您的有用評論 我明白了實現我的目標 – user3496255