2009-03-25 36 views
42

Tôi chắc chắn tôi đang làm điều gì đó thực sự rõ ràng là ngu ngốc, nhưng tôi đã cố gắng tìm ra nó trong vài giờ và không có gì nhảy ra ngoài với tôi.Django Imagefield không hoạt động bình thường thông qua ModelForm

Tôi đang sử dụng ModelForm để tôi có thể trưng ra một vài trường từ mô hình để chỉnh sửa. 2x ImageField, 1x TextField. Biểu mẫu được xử lý và TextField hoạt động. Hai ImageField không hoạt động và chúng là lý do tại sao tôi ở đây hôm nay.

Tôi đang sử dụng Django 1.0.2

Dưới đây là các mã có liên quan (yêu cầu nếu bạn cần thêm - và tôi không bao gồm HTML vì phần đó dường như làm việc tốt):

mẫu :

class Company(models.Model): 
    #... 
    logo = models.ImageField(upload_to='logos', blank=True) 
    intro_pic = models.ImageField(upload_to='intropics', blank=True) 
    intro_text = models.TextField(blank=True) 

Xem và hình thức:

def admin_edit(request, company_slug): 
    company = get_object_or_404(Company, slug = company_slug) 

    f = AdminEditForm(instance = company) 
    if request.method == 'POST': 
     f = AdminEditForm(request.POST, instance = company) 
     if f.is_valid(): 
      print "Processing form" 
      print f.cleaned_data['intro_pic'] 
      f.save() 

    return render_to_response('uadmin/edit.html', {'company':company, 'f':f}, RequestContext(request)) 


class AdminEditForm(ModelForm): 
    class Meta: 
     model = Company 
     fields = ['logo', 'intro_pic', 'intro_text'] 

Trả lời

97

Vâng, tôi cảm thấy như một thằng ngốc. Để cho Django để có thể xử lý các file được tải lên, bạn cần phải vượt qua biến request.FILES mẫu (có ý nghĩa, phải không ?!)

Trong trường hợp của tôi dòng sau đi từ:

f = AdminEditForm(request.POST, instance = company) 

để:

f = AdminEditForm(request.POST, request.FILES, instance = company) 

Một điều để kiểm tra (nếu bạn chạy vào một cái gì đó như thế này trong tương lai) là hình thức của bạn là nhiều phần dữ liệu. Thẻ <form> của bạn sẽ trông giống như sau:

<form enctype="multipart/form-data" method="post" action=""> 
+0

Cảm ơn! Trong trường hợp của tôi, tôi đã bỏ lỡ phần 'enctype =" multipart/form-data "' part –

+1

idiot ở đây – Chase

+0

Đó là một điều dễ dàng đáng ngạc nhiên để bỏ lỡ. Tôi đã từ khi tìm thấy cho phép Crispy xử lý các thẻ biểu mẫu của tôi (cũng như những thứ khác) giúp. – Oli

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