2009-10-15 11 views
5

W moim modelu UserProfile chciałbym mieć funkcję, która zwraca albo użytkownika ImageFileField przedmiot lub domyślnego obrazu, jeśli użytkownik nie dodał własne.Tworzenie i powrócić do domyślnego ImageFieldFile od wewnątrz funkcji

Na przykład:

class UserProfile(models.Model): 
    pic = models.ImageField('Headshot',blank=True, 
          upload_to=get_path_and_filename) 

    def get_pic(self): 
     if self.pic: 
      return self.pic 
     else: 
      # return ImageFileField with a default value 

chcę wrócić równoważny ImageFileField bo mam filtrów, które współpracują z tego typu obiektu (tak, nie mogę po prostu przekazać go ciąg, łatwo) ... Próbowałem patrząc na source code, ale nie wiem, jak to zrobić.

Czy istnieje łatwy sposób na zainicjowanie nowego obiektu ImageFileField, przekazując mu ścieżkę do pliku obrazu, a następnie go zwróci?

PS: myślałem o użyciu ustawienie domyślne dla ImageField, jednak wydaje się mniej elastyczne, ponieważ plik jest przechowywany na stworzeniu modelu ... i jeśli później chcesz zmienić domyślny plik, Musiałbym zaktualizować wszystkie wpisy bazy danych, które miały stary plik.

Odpowiedz

11

To był prawdopodobnie literówka, ale to, co faktycznie chcesz zwrócić, to ImageFieldFile.

Wartość ImageField powoduje, że właściwość instancji modelu jest faktycznie równa ImageFileDescriptor. Po uzyskaniu dostępu do właściwości zwraca instancję ImageFieldFile.

Dopóki nie nazywają save() lub delete() metod ImageFieldFile można instanciate jeden rozsądnie łatwo:

from django.db.models.fields.files import ImageFieldFile, FileField 

class UserProfile(models.Model): 
    # ... 

    def get_pic(self): 
     if self.pic: 
      return self.pic 
     return ImageFieldFile(instance=None, field=FileField(), 
           name='pictures/default.jpg') 
+0

Masz rację, to była literówka dysleksję z mojej strony (spójne, choć , Mógłbym dodać). Po prostu użyję funkcji 'get_pic' w moich szablonach ... mam nadzieję, że to nie będzie zbyt" niebezpieczne ". Mam zamiar spróbować jutro. Wygląda na to, że zrobi to, co chcę. Nie zdawałem sobie sprawy, że poszczególne pola mogą być 'save()' lub 'delete()' ... ucz się czegoś każdego dnia! Dziękuję Ci. – thornomad

+0

Wygląda na to, że powinien działać, ale pojawia się błąd: Plik "/usr/lib/python2.5/site-packages/django/db/models/fields/files.py", wiersz 23, w __init__ self.storage = field.storage AttributeError: Obiekt "NoneType" nie ma atrybutu "storage" Jeśli zmienię to na 'field = self.pic', to działa poprawnie; Próbowałem przekazać mu pusty obiekt ImageField, ale to nie zadziałało. Nie jestem pewien, czy to jest dobre, ale działa. – thornomad

+1

Och, zgadza się. Skłamałem, nie możesz użyć ImageFieldFile właśnie tak. Edytuję odpowiedź ... – SmileyChris

Powiązane problemy