Джанго. Отменить сохранение для модели

Перед сохранением модели я изменяю размер изображения. Но как я могу проверить, добавлено ли новое изображение или просто обновлено описание, чтобы я мог пропустить изменение масштаба при каждом сохранении модели?

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()


    def save(self, *args, **kwargs):
        if self.image:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

Я хочу изменить масштаб только в случае загрузки нового изображения или обновления изображения, но не при обновлении описания.

99 голосов | спросил Pol 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 20:21:44 +0300 2010, 20:21:44

4 ответа


0

Проверьте поле pk модели. Если это None, то это новый объект.

class Model(model.Model):
    image=models.ImageField(upload_to='folder')
    thumb=models.ImageField(upload_to='folder')
    description=models.CharField()


    def save(self, *args, **kwargs):
        if 'form' in kwargs:
            form=kwargs['form']
        else:
            form=None

        if self.pk is None and form is not None and 'image' in form.changed_data:
            small=rescale_image(self.image,width=100,height=100)
            self.image_small=SimpleUploadedFile(name,small_pic)
        super(Model, self).save(*args, **kwargs)

Редактировать: я добавил проверку для изображения в form.changed_data. Это предполагает, что вы используете сайт администратора для обновления ваших изображений. Вам также придется переопределить метод save_model по умолчанию, как указано ниже.

class ModelAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.save(form=form)
ответил David Graves 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 20:51:40 +0300 2010, 20:51:40
0

Вы можете указать дополнительный аргумент для подтверждения публикации нового изображения.
Что-то вроде:

def save(self, new_image=False, *args, **kwargs):
    if new_image:
        small=rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    super(Model, self).save(*args, **kwargs)

или передайте переменную запроса

def save(self, request=False, *args, **kwargs):
    if request and request.FILES.get('image',False):
        small=rescale_image(self.image,width=100,height=100)
        self.image_small=SimpleUploadedFile(name,small_pic)
    super(Model, self).save(*args, **kwargs)

Я думаю, что они не будут нарушать ваше сохранение при вызове просто.

Вы можете поместить это в свой файл admin.py, чтобы это работало и с сайтом администратора (для второго из приведенных выше решений):

class ModelAdmin(admin.ModelAdmin):

    ....
    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        instance.save(request=request)
        return instance
ответил crodjer 24 32010vEurope/Moscow11bEurope/MoscowWed, 24 Nov 2010 20:34:33 +0300 2010, 20:34:33
0

Что я сделал для достижения цели, так это сделал.

# I added an extra_command argument that defaults to blank
def save(self, extra_command="", *args, **kwargs):

и ниже метода save () это ..

# override the save method to create an image thumbnail
if self.image and extra_command != "skip creating photo thumbnail":
    # your logic here

поэтому, когда я редактирую некоторые поля, но не редактирую изображение, я помещаю это ..

Model.save("skip creating photo thumbnail")

вы можете заменить "skip creating photo thumbnail" на "im just editing the description" или более формальный текст.

Надеюсь, это поможет!

ответил bonbon.langes 9 62013vEurope/Moscow11bEurope/MoscowSat, 09 Nov 2013 17:49:22 +0400 2013, 17:49:22
0

Я нашел еще один простой способ сохранить данные в базе данных

models.py

class LinkModel(models.Model):
    link = models.CharField(max_length=500)
    shortLink = models.CharField(max_length=30,unique=True)

В базе данных у меня есть только 2 переменные

views.py

class HomeView(TemplateView):
    def post(self,request, *args, **kwargs):
        form = LinkForm(request.POST)

        if form.is_valid():
            text = form.cleaned_data['link'] # text for link

        dbobj = LinkModel()
        dbobj.link = text
        self.no = self.gen.generateShortLink() # no for shortLink
        dbobj.shortLink = str(self.no)
        dbobj.save()         # Saving from views.py

В этом примере я создал экземпляр модели только в views.py и поместил /сохранил данные в 2 переменные только из представлений.

ответил Devendra Bhat 24 MarpmSat, 24 Mar 2018 21:14:27 +03002018-03-24T21:14:27+03:0009 2018, 21:14:27

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132