Oto mój model. To, co chcę zrobić, to wygenerować nowy plik i nadpisać istniejący za każdym razem, gdy zapisywana jest instancja modelu:
class Kitten(models.Model):
claw_size = ...
license_file = models.FileField(blank=True, upload_to='license')
def save(self, *args, **kwargs):
#Generate a new license file overwriting any previous version
#and update file path
self.license_file = ???
super(Request,self).save(*args, **kwargs)
Widzę dużo dokumentacji o tym, jak przesłać plik. Ale jak wygenerować plik, przypisać go do pola modelu i sprawić, by Django przechowało go we właściwym miejscu?
źródło
convert_to_pdf
. Dziękuję Ci!!f = open('/path/to/file', 'r')
dla pliku typu ZIP,f = open('/path/to/file.zip', 'rb')
MEDIA_ROOT
nie został udostępniony z tym samym woluminem w programie selerowym. Udostępnienie nazwanego woluminu naprawiło to ( ref ).Zaakceptowana odpowiedź jest z pewnością dobrym rozwiązaniem, ale oto sposób, w jaki zabrałem się za generowanie pliku CSV i podawanie go z perspektywy.
Pomyślałem, że warto umieścić to tutaj, ponieważ zajęło mi trochę majstrowania, aby uzyskać wszystkie pożądane zachowanie (nadpisanie istniejącego pliku, przechowywanie we właściwym miejscu, brak tworzenia duplikatów plików itp.).
Django 1.4.1
Python 2.7.3
źródło
Dobrą praktyką jest korzystanie z menedżera kontekstu lub połączenia telefonicznego
close()
w przypadku wyjątków podczas procesu zapisywania pliku. Może się to zdarzyć, jeśli Twoja pamięć masowa nie działa itp.Wszelkie zachowanie związane z zastępowaniem należy skonfigurować w zapleczu magazynu. Na przykład S3Boto3Storage ma ustawienie
AWS_S3_FILE_OVERWRITE
. Jeśli używaszFileSystemStorage
, możesz napisać własny mixin .Możesz także chcieć wywołać metodę save modelu zamiast metody save FileField, jeśli chcesz, aby wystąpiły jakiekolwiek niestandardowe efekty uboczne, takie jak ostatnio zaktualizowane znaczniki czasu. W takim przypadku możesz również ustawić atrybut nazwy pliku na nazwę pliku - która jest względna do
MEDIA_ROOT
. Domyślnie jest to pełna ścieżka do pliku, która może powodować problemy, jeśli jej nie ustawisz - zobacz File .__ init __ () i File.name .Oto przykład, w którym
self
jest instancja modelu, gdziemy_file
jest FileField / ImageFile, wywołującsave()
całą instancję modelu zamiast tylko FileField:źródło