2011-11-18 12 views
15

Próbuję utworzyć pole w modelu, które powinno przechowywać obraz dla zarejestrowanego użytkownika. Ten obraz powinien zostać zmieniony i zapisany w osobnym katalogu użytkownika, takim jak media/users/10/photo.jpeg.Obraz użytkownika sklepu Django w modelu

Szukałem dużo, ale nadal nie mogę znaleźć sposobu, aby zrobić to czysto i poprawnie. Wydaje mi się, że wiele witryn wymaga tej samej funkcjonalności i powinno to być w dokumentach django, ale tak nie jest.

+0

Ty tworzysz katalog dla każdego identyfikatora użytkownika? Dlaczego nie "media/users/10.jpeg"? Po prostu pytam: D –

+0

Ponieważ do przechowywania może być przechowywana inna zawartość użytkownika :) – dragoon

+0

Och, widzę! Myślę, że mam podobny problem, pozwól mi zobaczyć, czy mogę pomóc –

Odpowiedz

35

Chcesz skorzystać z opcji "upload_to" na ImageField

#models.py 
import os 

def get_image_path(instance, filename): 
    return os.path.join('photos', str(instance.id), filename) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    profile_image = ImageField(upload_to=get_image_path, blank=True, null=True) 

Jest to kod bezpośrednio z projektem kopalni. Przesłany obraz idzie /MEDIA_ROOT/photos/<user_id>/filename

o co chcesz, wystarczy zmienić ciąg „Zdjęcia” do „użytkownicy” w def get_image_path

Oto mały kawałek o tym w docs, pod FileField szczegółów

+0

Fajnie , to faktycznie zapisuje plik w poprawnej lokalizacji, ale kiedy używam w szablonie '' {{user.profile_image}} '' z jakiegoś powodu daje ''/users/users/40/photo.png'' zamiast '' '/ media/users/40/photo.png'' – dragoon

+1

Przepraszam, powinienem używać modeli' '{{user.profile_image.url}}' ' – dragoon

+3

.ForeignKey (User, unique = True) powinien być modelami .OneToOneField (Użytkownik) – vinyll

0

Musisz utworzyć model, który ma klucz obcy dla modelu użytkownika, gdzie możesz mieć image field dla użytkownika. Nie polecam modyfikowania samego modelu użytkownika.

+2

Przykro mi, ale pytanie nie dotyczy modelu, chodzi o to, jak przechowywać obrazy. – dragoon

+1

Możesz utworzyć ścieżkę dynamicznego przesyłania dla dowolnego pola FileField lub Image. Po prostu dodaj funkcję do swojego modelu, która zwraca ścieżkę do upload_to. Możesz znaleźć przykład w dokumentach Django pod adresem: https://docs.djangoproject.com/en/1.3/ref/models/fields/#filefield – Brandon

+1

Nie najlepsza odpowiedź, ale nie warto głosować w dół ... – nicorellius

Powiązane problemy