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)。我怎樣才能獲得這些價值?
在此先感謝。