2011-11-18 36 views
15

Tôi đang cố gắng tạo một trường trong một mô hình, sẽ lưu trữ hình ảnh cho người dùng đã đăng ký. Hình ảnh này phải được đổi tên và lưu trữ trong một thư mục người dùng riêng biệt như media/users/10/photo.jpeg.Hình ảnh người dùng cửa hàng Django trong mô hình

Tôi đã tìm kiếm rất nhiều, nhưng vẫn không thể tìm thấy cách làm sạch và chính xác. Dường như với tôi rằng nhiều trang web yêu cầu cùng một chức năng và điều này nên được trong tài liệu django, nhưng nó không phải là.

+0

Bạn đang tạo thư mục cho mọi id người dùng? Tại sao không phải 'media/users/10.jpeg'? Chỉ cần hỏi: D –

+0

Vì có thể có nội dung liên quan đến người dùng khác để lưu trữ :) – dragoon

+0

Ồ, tôi hiểu rồi! Tôi nghĩ rằng tôi đã phải đối mặt với một vấn đề tương tự cho tôi biết nếu tôi có thể giúp đỡ –

Trả lời

35

Bạn muốn sử dụng "upload_to" tùy chọn trên một 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) 

Đây là mã trực tiếp từ một dự án của tôi. Hình ảnh đăng tải đi vào /MEDIA_ROOT/photos/<user_id>/filename

Đối với những gì bạn muốn, chỉ cần thay đổi chuỗi 'ảnh' thành 'người' trong def get_image_path

Đây là chút nhỏ về nó trong các tài liệu, dưới FileField chi tiết

+0

Cool , điều này thực sự lưu tệp vào đúng vị trí, nhưng khi tôi sử dụng trong template '' {{user.profile_image}} '', vì một lý do nào đó cho ''/users/users/40/photo.png'' thay vì ' «/ media/users/40/photo.png'' – dragoon

+1

Xin lỗi, tôi nên sử dụng' '{{user.profile_image.url}}' ' – dragoon

+3

models.ForeignKey (Người dùng, unique = True) phải là models.OneToOneField (Người dùng) – vinyll

0

Bạn cần tạo mô hình có khóa ngoài cho Mô hình người dùng, nơi bạn có thể có một image field cho Người dùng. Tôi sẽ không khuyên bạn sửa đổi mô hình User.

+2

Tôi xin lỗi, nhưng câu hỏi không phải là về mô hình, đó là về cách lưu trữ hình ảnh. – dragoon

+1

Bạn có thể tạo đường dẫn tải lên động cho bất kỳ trường FileField hoặc Image nào. Chỉ cần thêm một hàm vào mô hình của bạn trả về đường dẫn cho upload_to. Bạn có thể tìm thấy một ví dụ trong tài liệu Django tại: https://docs.djangoproject.com/en/1.3/ref/models/fields/#filefield – Brandon

+1

Không phải là câu trả lời hay nhất, nhưng không đáng để bỏ phiếu ... – nicorellius

1

Tôi đề nghị bạn xem xét django-photologue. Một ứng dụng django của nó với tất cả các hình ảnh quản lý, tải lên và lưu trữ đã được thực hiện!

Thông tin thêm về tại địa chỉ: http://code.google.com/p/django-photologue/

Các vấn đề liên quan