2015-07-20 59 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!使用该应用程序,我不需要验证交换功能,因为在模板中,您当时只能更新一行。

相关问题