限制记录数量

时间:2013-03-02 08:41:12

标签: django

我有一个问题,我在谷歌找不到的答案。

所以,我有汽车模型(只有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。怎么限制?

由于

2 个答案:

答案 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!")