2015-07-20 15 views
0

我想在Django管理站點的列表視圖(使用可編輯)中的整數字段(序列)實現交換功能。我的代碼:如何做列表中的全局驗證可編輯Django管理站點

models.py

class SortedMonitorables(models.Model): 


    sequence = models.PositiveSmallIntegerField() 
    monitorable_id = models.CharField(max_length=80, primary_key=True) 

    def __unicode__(self): 
     return u'{}-{}'.format(
      self.sequence, self.monitorable_id) 

    class Meta(object): 
     ordering = ['sequence'] 

forms.py

class SortedMonitorablesAdminForm(ModelForm): 


    class Meta: 
     model = SortedMonitorables 

    def clean_sequence(self): 
     """Manually sequence validation.""" 
     try: 
      sequence = self.cleaned_data['sequence'] 
      monitorable_id = self.instance.monitorable_id 
      records = SortedMonitorables.objects.filter(sequence=sequence).\ 
       exclude(monitorable_id=monitorable_id).count() 
      if records >= 1: 
       raise ValidationError(
        'Sequence {} is already defined'.format(sequence)) 
     except ValidationError as e: 
      raise ValidationError(e) 
     except Exception: 
      raise ValidationError('Fatal error checking sequence') 
     else: 
      return sequence 

admin.py

@admin.register(SortedMonitorables) 
class SortedMonitorableAdmin(admin.ModelAdmin): 

    form = SortedMonitorablesAdminForm 

    list_display = ('monitorable_id', 'sequence') 
    list_display_links = ('monitorable_id',) 
    list_editable = ('sequence',) 
    search_fields = ['monitorable_id'] 
    list_per_page = 10 

    def get_readonly_fields(self, request, obj=None): 
     """Make some fields readonly on edition.""" 
     if obj: 
      return self.readonly_fields + ('monitorable_id',) 
     return self.readonly_fields 

    def get_changelist_form(self, request, **kwargs): 
     """Setting form to use in formset.""" 
     return SortedMonitorablesAdminForm 

在管理小號伊特我有這樣的事情:

 
monitorable_id sequence 

'aa'    | 1 | 
'bb'    | 2 | 
'cc'    | 3 | 

在該列表中,我可以直接修改序列和我爲序列字段定義的驗證(唯一值)的作品好,二者的編輯和列表頁面。一個用戶想在同一時間更改爲「AA」和「BB」的序列,得到類似的東西:

 
monitorable_id sequence 

'aa'    | 2 | 
'bb'    | 1 | 
'cc'    | 3 | 
當用戶希望在列表頁面交換序列值,即我的問題來了

當這種情況發生時,用戶得到一個錯誤,因爲唯一的序列驗證檢測到兩個數字已經被另一個可監測的定義/使用。在Django使用SortedMonitorablesAdminForm驗證列表中的每一行之前,我想讓列表中的所有序列值都可編輯(來自formset)。我怎樣才能獲得這些價值?

在此先感謝。

回答

0

一位同事向我推薦了一個應用程序,它可以滿足我的需求,所以你可以找到它here!使用該應用程序,我不需要驗證交換功能,因爲在模板中,您當時只能更新一行。

相關問題