2013-03-02 7 views
0

У меня есть один вопрос, ответ, который я не могу найти в Google.Ограничение количества записей

Итак, у меня есть модель автомобилей (только символьные поля) и модель фотографии этого авто:

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 фотографии (макс.). Возможно? Как вы можете видеть, у меня есть поле main, картинка с этим полем = 1 появится в галерее, как стартовое изображение в слайд-шоу. Но я могу добавить main=1 для всех фотографий, и это неправильно. Таким образом, его можно сделать следующее:

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

Один автомобиль имеет 4 позиции (максимум) в картинках таблице (4 фото), и только один из того, что картины имеет основной = 1. В интерфейсе администратора я могу добавить много изображений для одного автомобиля и добавить main = 1 для всех изображений. Как это можно ограничить?

Благодаря

ответ

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 
+0

wow :) и как сделать только 1 из 4 основных = 1? 'main = MyModel.objects.all(). filter (main = 1) .count()' в новом def с тем же, если? Я делаю это, но я могу добавить для всех 4 pictres main = 1 – tim

+0

просто определите Картинки в MyModel, это будет считаться. и фильтр main = True – catherine

+0

ok answer updates – catherine

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) 

Bonus: сделать требуется основное изображение:

 if not data.filter(main=True).count() == 1: 
      raise forms.ValidationError("Exact 1 main image required!") 
+0

Я только понял, что этот вопрос старый ... @tim - мой ответ еще полезно? – allcaps

Смежные вопросы