2016-03-23 17 views
0

Benim models.py içinde, kaydetmeden önce ImageField'i işlemek için save() geçersiz kıldım. Kullanıcı bir Charfield gibi diğer bazı alanını değiştirir ve nesneyi güncelleştirir yaniDjango Bir form alanı doldurulduğunda nasıl algılanır?

class Image(models.Model): 
    caption = models.Charfield(max_length=254) 
    image = models.ImageField(upload_to='') 

    def save(self, *args, **kwargs): 
     if self.image: 
      # image manipulations 
      super(Image, self).save(*args, **kwargs) 

nesne ImageField değiştirmeden kaydedilirse manipülasyon görüntü üzerinde çalışacak olmamalıdır. Bunu test etmedim, ancak yukarıdaki kodda, kullanıcı eski dosyayı değiştirmek için yeni bir görüntü yüklemeden kaydetse bile, self.image her zaman True olacaktır.

Yani, bir resim dosyası ile başlamak için kullanıcı tarafından yüklenen olsun veya olmasın dayanarak bu kontrol planı:

if form.is_valid(): 
    instance = form.save(commit=False) 
    if form.cleaned_data.get('image'): 
     image_was_uploaded = True 
    instance.save(image_was_uploaded=image_was_uploaded) 

bu Bunu gerçekleştirmek için geçerli bir yöntem mi, yoksa daha iyi olduğunu/daha Pythonic yaklaşımı (umarım models.py içinde çalışır, bu yüzden Yönetici ve DRF aynı işlevsellikten faydalanır)?

cevap

1

Özel işleminizi temiz yöntemiyle işleyen özel bir ImageField'a bakmak isteyebilirsiniz. Örnek olarak şu şekilde bir göz atın: https://djangosnippets.org/snippets/2206/

+0

Eski dosyayı değiştirmek için yeni bir dosya yüklenip yüklenmediğini nasıl bilebilirim? – dtgq

+0

Aldığınız dosya türüne bakmayı deneyin ve eğer bu bir UploadedFile örneğidir: https://docs.djangoproject.com/en/1.9/ref/files/uploads/#uploaded-files –

+0

Bunun gibi görünüyor Bunu yapmanın en doğal yolu ol. Buna nasıl erişeceğimi/kullanacağımı bilmiyorum, "tür (request.FILES ['image']) == django.core.files.uploadedfile.UploadedFile" demek doğru mu yoksa isinstance (request.FILES ['image'], django.core.files.uploadedfile.UploadedFile) '? – dtgq

0

Temiz yöntemi geçersiz kılarak ve kontrol ederek form sınıfında bunu yapabilirim. görünümünden is_valid() öğesini çağırdığınızda, bu denetimi yapabileceğiniz temiz yöntemi çağırır.