我有一个问题,我在谷歌找不到的答案。
所以,我有汽车模型(只有char字段)和汽车图片模型:
class Pictures(models.Model):
car = models.ForeignKey(Car,related_name='pictures')
path = models.CharField(max_length=255)
about = models.CharField(max_length=32)
main = models.BooleanField('Main Picture')
def __unicode__(self):
return str(self.id)
可以执行以下操作:我只想为一辆车拍摄4张照片。例如,宝马X5 - 只有4张图片,我不能添加5张图片(来自管理界面)。一辆车 - 4张照片(最多)。这是可能的?
正如你所看到的,我有一个字段main
,这个字段= 1的图片将在图库中显示,就像幻灯片放映中的开始图片一样。但是我可以为所有图片添加main=1
,这是错误的。因此,它可以做到以下几点:
1 car = 3 pictures(main=0) + 1 picture(main=1)
一辆车在图片表中有4个位置(最多)(4张图片),其中只有一张图片的主要值= 1。在管理界面中,我可以为一辆车添加许多图片,并为所有图片添加main = 1。怎么限制?
由于
答案 0 :(得分:0)
class MyModelAdmin(admin.ModelAdmin):
...........
def has_add_permission(self, request):
count = Pictures.objects.filter(main=True).count()
if count <= 4:
return True
return False
答案 1 :(得分:0)
使用自定义表单和干净方法验证您的模型。
model.py:
class Image(models.Model):
image = models.ImageField(upload_to='images/%Y/%m/%d', ...)
main = models.BooleanField()
# Distinguish between main and normal images
def __unicode__(self):
if self.main:
return "%s (main)" %self.image
else:
return self.image
class Car(models.Model):
...
images = models.ManyToManyField(Image, blank=True, null=True,
related_name="%(app_label)s_%(class)s_related",
help_text="Max 1 main image and max 4 images total.")
然后在你的admin.py中创建一个带有自定义清理方法的ModelForm:
from django import forms
from django.contrib import admin
from models import Image, Car
class CarAdminForm(forms.ModelForm):
class Meta:
model = Car
def clean_images(self):
data = self.cleaned_data['images']
if data.count() > 4:
raise forms.ValidationError("Max 4 images.")
if data.filter(main=True).count() > 1:
raise forms.ValidationError("Max 1 main image.")
return data
class CarAdmin(admin.ModelAdmin):
form = CarAdminForm
filter_horizontal = ['images', ]
...
admin.site.register(Car, CarAdmin)
奖励:制作所需的主图像:
if not data.filter(main=True).count() == 1:
raise forms.ValidationError("Exact 1 main image required!")