2011-01-12 32 views
5

Tôi có Model sau:Làm cách nào để gắn hình ảnh vào biểu mẫu chỉnh sửa ở Django?

class Listing(models.Model): 
    name = models.CharField(max_length=50, verbose_name="Title") 
    images = models.ManyToManyField('Image') 

, với ManyToManyField liên kết đến Image lớp này:

class Image(models.Model): 
    thumb = ImageField(upload_to='images/uploads/') 
    number = models.PositiveSmallIntegerField() 

ModelForm tương ứng như sau:

class ListingEditForm(ModelForm): 
    image1 = ImageField(required=False, label="Photo 1") 
    image2 = ImageField(required=False, label="Photo 2") 
    image3 = ImageField(required=False, label="Photo 3") 

    class Meta: 
     model = Listing 
     exclude = ('images') 

Ý tưởng là để không giới hạn số lượng hình ảnh có thể được liên kết với một số Listing trong ba ckend, nhưng tại thời điểm này tôi chỉ cần 3 hình ảnh trong biểu mẫu. Tải lên các hình ảnh hoạt động tốt, nhưng làm thế nào bạn sẽ đi về ràng buộc các hình thức để một ví dụ Listing để các hình ảnh không phải là 'Không' khi một trong những xem các hình thức chỉnh sửa?

Rõ ràng, điều này một mình sẽ không làm việc, vì image1, image2image3 chỉ lĩnh vực hình thức, chứ không phải là một phần của mô hình:

form = forms.ListingEditForm(instance=listing) 

Vì vậy, thêm một từ điển như tham số đầu tiên có vẻ như rõ ràng điều cần làm:

form = forms.ListingEditForm({'image1': ...},instance=listing) 

nhưng giá trị của số đó ... là gì? Và làm thế nào để lấy nó từ ví dụ Listing?

Trả lời

2

Tôi sẽ trả lời câu hỏi của riêng mình, mặc dù đó không phải là câu trả lời tôi đang tìm kiếm. Tôi đã nhìn xung quanh, và theo như tôi biết, không có cách nào đáng tin cậy trong HTML để thay đổi nội dung của trường Nhập tệp. Vì vậy, tôi có thể sai, nhưng ngay cả khi bạn gửi thông tin đó với yêu cầu, Django sẽ không có cách nào để hiển thị thông tin trong trường (vì nó không tương ứng với một tệp trên máy tính cục bộ).

Vì vậy, giải pháp của tôi chỉ đơn giản là để gửi các url của hình ảnh với yêu cầu, là một bình thường:

return render_to_response('edit.html', {'image1': image1_url, ...}) 

Sau đó, nếu thông tin này là hiện nay, tôi sử dụng jQuery để đặt những hình ảnh bên cạnh trường nhập tệp trong mẫu và cập nhật nó nếu người dùng chọn tệp mới. Nó không phải là tốt nhất, nhưng nó hoạt động.

Tôi vẫn rất vui khi biết bất kỳ giải pháp nào khác.

0

Tôi sẽ sử dụng quan hệ khóa ngoại trong Hình ảnh và inlineformset_factory để tạo biểu mẫu.

ListingEditForm = inlineformset_factory(Listing, Image, max_num=3, extra=0)

Tôi cũng sẽ thêm trường tên hình ảnh trong mô hình Hình ảnh. Bằng cách đó, người dùng sẽ có chỉ dẫn của các tập tin tải lên trong màn hình hiển thị hình thức, và anh ta cũng sẽ có thể xóa hình ảnh nếu anh ta whishes như vậy. Nếu bạn cần tải lên không giới hạn, bạn có thể chỉ cần thay đổi max_num thành 0 và thêm thành 1.

Tất nhiên là bạn không thể kết hợp một hình ảnh với nhiều đối tượng danh sách, nhưng nếu bạn cần người dùng có thể xóa hình ảnh không được đề nghị.

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