我有这样的模型
class Campaign(models.Model):
campaign_name= models.CharField(max_length=30)
user=models.ForeignKey(User)
rows=models.IntegerField(default=3)
columns=models.IntegerField(default=1)
def __str__(self): # __unicode__ on Python 2
return self.campaign_name+": "+self.campaign_desc
def save(self, *args, **kwargs):
print("Doing Custom Task ")
super(Campaign, self).save(*args, **kwargs) # Call the "real" save() method.
class Item(models.Model):
campaign=models.ForeignKey(Campaign)
item_name=models.CharField(max_length=70)
item_ID=models.CharField(max_length=400)
def __str__(self):
return self.item_name
我已使用admin.site.register(Campaign,CampaignAdmin)
在管理员中注册了广告系列,并希望每个广告系列中的项目数为广告系列X列(外键)。
Q1)如果我在print("Doing Custom Task ")
的位置使用保存覆盖方法对其进行验证,则在创建实例时我无法保存该实例。
Q2)将要填充的项目数量恰当地显示也很不错。现在我有了
class ItemInline(admin.TabularInline):
model = Item
#extra = 4
在admin.py中的基本上我希望额外的参数是行X列
答案 0 :(得分:1)
如果您想进行自定义验证,最好通过表单或(作为最后的手段)使用Model.clean*
方法系列进行。
class Campaign(models.Model):
def clean(self):
if self.pk:
if self.item_set.count() > 5 # Or whatever number you need
raise ValidationError(_('Too much items for me.'))
覆盖内联的get_extra()
方法:
class ItemInline(admin.TabularInline):
extra = 4
def get_extra(self, request, obj=None, **kwargs):
if obj:
return obj.rows * obj.columns
return self.extra