0

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

所以,我有汽车的模型(只有字符字段)和汽车的图片模型:

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 张照片。例如,BMW X5 - 只有 4 张图片,我无法添加 5​​ 张图片(来自管理界面)。一辆车 - 4 张图片(最多)。这是可能的?如您所见,我有 field main,此 field=1 的图片将出现在画廊中,就像幻灯片中的起始图片一样。但我可以main=1为所有图片添加,这是错误的。因此,它可能执行以下操作:

1 car = 3 pictures(main=0) + 1 picture(main=1)

一辆车在图片表(4张图片)中有4个位置(最大),其中只有一张图片的main = 1。在管理界面中,我可以为一辆车添加多张图片,并为所有图片添加 main=1。怎么能被限制?

谢谢

4

2 回答 2

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
于 2013-03-02T08:50:04.993 回答
0

使用自定义表单和 clean 方法验证您的模型。

模型.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 中使用自定义 clean 方法创建一个 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!")
于 2013-07-05T09:01:58.100 回答