【问题标题】:Django Upload form to S3 img and form validationDjango 将表单上传到 S3 img 和表单验证
【发布时间】:2011-01-31 12:10:58
【问题描述】:

我对 Django 和 Python 都很陌生。这是我第一次使用 django 使用表单和上传文件。我可以上传并保存到数据库以正常工作,但它无法有效的电子邮件或检查用户是否选择了要上传的文件。我花了很多时间阅读文档试图弄清楚这一点。谢谢!

views.py

def submit_photo(request):
    if request.method == 'POST':
        def store_in_s3(filename, content):
            conn = S3Connection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)
            bucket = conn.create_bucket(AWS_STORAGE_BUCKET_NAME)
            mime = mimetypes.guess_type(filename)[0] 
            k = Key(bucket)
            k.key = filename
            k.set_metadata("Content-Type", mime)
            k.set_contents_from_file(content)
            k.set_acl('public-read')

        if imghdr.what(request.FILES['image_url']):
            qw = request.FILES['image_url']
            filename = qw.name
            image = filename
            content = qw.file
            url  = "http://bpd-public.s3.amazonaws.com/" + image

            data = {image_url : url, user_email : request.POST['user_email'], user_twittername : request.POST['user_twittername'], user_website : request.POST['user_website'], user_desc : request.POST['user_desc']}
            s = BeerPhotos(data)
            if s.is_valid():
                #import pdb; pdb.set_trace()
                s.save()
                store_in_s3(filename, content)      
                return HttpResponseRedirect(reverse('photos.views.thanks'))
            return s.errors
        else:           
            return errors

    else:
        form = BeerPhotoForm()

    return render_to_response('photos/submit_photos.html', locals(),context_instance=RequestContext(request)

forms.py

class BeerPhotoForm(forms.Form):
    image_url = forms.ImageField(widget=forms.FileInput, required=True,label='Beer',help_text='Select a image of no more than 2MB.')
    user_email = forms.EmailField(required=True,help_text='Please type a valid e-mail address.')
    user_twittername = forms.CharField()
    user_website = forms.URLField(max_length=128,)
    user_desc = forms.CharField(required=True,widget=forms.Textarea,label='Description',)

模板.html

<div id="stylized" class="myform">
    <form action="." method="post" enctype="multipart/form-data" width="450px">
        <h1>Photo Submission</h1>
        {% for field in form %}
                {{ field.errors }}
                {{ field.label_tag }} {{ field }}
        {% endfor %}
        <label><span>Click here</span></label>      
    <input type="submit" class="greenbutton" value="Submit your Photo" />
    </form>
</div>

【问题讨论】:

  • 暂时放弃这个。本地上传,以后会解决的,仅供参考。

标签: django django-templates django-forms


【解决方案1】:

我认为问题在于您使用forms.ImageField() 来验证网址。你可能想使用forms.UrlField()

或者

您根本不应该将 url 传递给文件。相反,您可以执行s = BeerPhoto(request.POST, request.FILES) 并在运行s.is_valid() 后处理文件

http://docs.djangoproject.com/en/dev/topics/http/file-uploads/

【讨论】:

  • 我只是将URL保存在数据库中,并将图像上传到s3。我已经移动了 imghr 检查,所以它在 s.is_valid() 之后完成。感谢到目前为止的建议。它还没有工作。
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 2021-09-23
  • 2011-03-10
  • 2011-01-19
  • 2021-06-05
  • 2013-11-30
  • 2012-09-08
  • 2015-04-27
相关资源
最近更新 更多