Django

Code

Changeset 5986

Show
Ignore:
Timestamp:
08/20/07 08:24:10 (11 months ago)
Author:
russellm
Message:

Fixed #5211 -- Added paths starting with '/' to the list of paths that are preserved as-is by the widget media framework.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/django/newforms/widgets.py

    r5926 r5986  
    1515from django.utils.encoding import StrAndUnicode, force_unicode 
    1616from util import flatatt 
     17from urlparse import urljoin 
    1718 
    1819__all__ = ( 
     
    6364         
    6465    def absolute_path(self, path): 
    65         return (path.startswith(u'http://') or path.startswith(u'https://')) and path or u''.join([settings.MEDIA_URL,path]) 
     66        if path.startswith(u'http://') or path.startswith(u'https://') or path.startswith(u'/'): 
     67            return path 
     68        return urljoin(settings.MEDIA_URL,path) 
    6669 
    6770    def __getitem__(self, name): 
  • django/branches/newforms-admin/docs/newforms.txt

    r5984 r5986  
    21402140 
    21412141Paths used to specify media can be either relative or absolute. If a path  
    2142 starts with 'http://' or 'https://', it will be interpreted as an absolute 
     2142starts with '/', 'http://' or 'https://', it will be interpreted as an absolute 
    21432143path, and left as-is. All other paths will be prepended with the value of 
    21442144``settings.MEDIA_URL``. For example, if the MEDIA_URL for your site was 
     
    21472147    class CalendarWidget(forms.TextInput): 
    21482148        class Media: 
     2149            css = { 
     2150                'all': ('/css/pretty.css',), 
     2151            } 
    21492152            js = ('animations.js', 'http://othersite.com/actions.js') 
    21502153 
    21512154    >>> w = CalendarWidget() 
    21522155    >>> print w.media 
     2156    <link href="/css/pretty.css" type="text/css" media="all" rel="stylesheet" /> 
    21532157    <script type="text/javascript" src="http://media.example.com/animations.js"></script> 
    21542158    <script type="text/javascript" src="http://othersite.com/actions.js"></script> 
  • django/branches/newforms-admin/tests/regressiontests/forms/media.py

    r5926 r5986  
    55>>> from django.newforms import TextInput, Media, TextInput, CharField, Form, MultiWidget 
    66>>> from django.conf import settings 
    7 >>> settings.MEDIA_URL = 'http://media.example.com
     7>>> settings.MEDIA_URL = 'http://media.example.com/media/
    88 
    99# Check construction of media objects 
    10 >>> m = Media(css={'all': ('/path/to/css1','/path/to/css2')}, js=('/path/to/js1','http://media.other.com/path/to/js2','https://secure.other.com/path/to/js3')) 
     10>>> m = Media(css={'all': ('path/to/css1','/path/to/css2')}, js=('/path/to/js1','http://media.other.com/path/to/js2','https://secure.other.com/path/to/js3')) 
    1111>>> print m 
    12 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    13 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    14 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     12<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     13<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     14<script type="text/javascript" src="/path/to/js1"></script> 
    1515<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    1616<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    1818>>> class Foo: 
    1919...     css = { 
    20 ...        'all': ('/path/to/css1','/path/to/css2') 
     20...        'all': ('path/to/css1','/path/to/css2') 
    2121...     } 
    2222...     js = ('/path/to/js1','http://media.other.com/path/to/js2','https://secure.other.com/path/to/js3') 
    2323>>> m3 = Media(Foo) 
    2424>>> print m3 
    25 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    26 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    27 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     25<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     26<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     27<script type="text/javascript" src="/path/to/js1"></script> 
    2828<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    2929<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    3131>>> m3 = Media(Foo) 
    3232>>> print m3 
    33 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    34 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    35 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     33<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     34<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     35<script type="text/javascript" src="/path/to/js1"></script> 
    3636<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    3737<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    5555...     class Media: 
    5656...         css = { 
    57 ...            'all': ('/path/to/css1','/path/to/css2') 
     57...            'all': ('path/to/css1','/path/to/css2') 
    5858...         } 
    5959...         js = ('/path/to/js1','http://media.other.com/path/to/js2','https://secure.other.com/path/to/js3') 
     
    6161>>> w1 = MyWidget1() 
    6262>>> print w1.media 
    63 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    64 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    65 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     63<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     64<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     65<script type="text/javascript" src="/path/to/js1"></script> 
    6666<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    6767<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    6969# Media objects can be interrogated by media type 
    7070>>> print w1.media['css'] 
    71 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    72 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     71<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     72<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    7373 
    7474>>> print w1.media['js'] 
    75 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     75<script type="text/javascript" src="/path/to/js1"></script> 
    7676<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    7777<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    8989...     class Media: 
    9090...         css = { 
    91 ...            'all': ('/path/to/css3','/path/to/css1') 
     91...            'all': ('/path/to/css3','path/to/css1') 
    9292...         } 
    9393...         js = ('/path/to/js1','/path/to/js4') 
     
    9696>>> w3 = MyWidget3() 
    9797>>> print w1.media + w2.media + w3.media 
    98 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    99 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    100 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    101 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    102 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    103 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    104 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     98<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     99<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     100<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     101<script type="text/javascript" src="/path/to/js1"></script> 
     102<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     103<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     104<script type="text/javascript" src="/path/to/js4"></script> 
    105105 
    106106# Check that media addition hasn't affected the original objects 
    107107>>> print w1.media 
    108 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    109 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    110 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     108<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     109<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     110<script type="text/javascript" src="/path/to/js1"></script> 
    111111<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    112112<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    124124>>> w4 = MyWidget4() 
    125125>>> print w4.media 
    126 <link href="http://media.example.com/some/path" type="text/css" media="all" rel="stylesheet" /> 
    127 <script type="text/javascript" src="http://media.example.com/some/js"></script> 
     126<link href="/some/path" type="text/css" media="all" rel="stylesheet" /> 
     127<script type="text/javascript" src="/some/js"></script> 
    128128 
    129129# Media properties can reference the media of their parents 
     
    135135>>> w5 = MyWidget5() 
    136136>>> print w5.media 
    137 <link href="http://media.example.com/some/path" type="text/css" media="all" rel="stylesheet" /> 
    138 <link href="http://media.example.com/other/path" type="text/css" media="all" rel="stylesheet" /> 
    139 <script type="text/javascript" src="http://media.example.com/some/js"></script> 
    140 <script type="text/javascript" src="http://media.example.com/other/js"></script> 
     137<link href="/some/path" type="text/css" media="all" rel="stylesheet" /> 
     138<link href="/other/path" type="text/css" media="all" rel="stylesheet" /> 
     139<script type="text/javascript" src="/some/js"></script> 
     140<script type="text/javascript" src="/other/js"></script> 
    141141 
    142142# Media properties can reference the media of their parents, 
     
    149149>>> w6 = MyWidget6() 
    150150>>> print w6.media 
    151 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    152 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    153 <link href="http://media.example.com/other/path" type="text/css" media="all" rel="stylesheet" /> 
    154 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    155 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    156 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    157 <script type="text/javascript" src="http://media.example.com/other/js"></script> 
     151<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     152<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     153<link href="/other/path" type="text/css" media="all" rel="stylesheet" /> 
     154<script type="text/javascript" src="/path/to/js1"></script> 
     155<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     156<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     157<script type="text/javascript" src="/other/js"></script> 
    158158 
    159159############################################################### 
     
    167167>>> w7 = MyWidget7() 
    168168>>> print w7.media 
    169 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    170 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    171 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
     169<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     170<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     171<script type="text/javascript" src="/path/to/js1"></script> 
    172172<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    173173<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     
    177177...     class Media: 
    178178...         css = { 
    179 ...            'all': ('/path/to/css3','/path/to/css1') 
     179...            'all': ('/path/to/css3','path/to/css1') 
    180180...         } 
    181181...         js = ('/path/to/js1','/path/to/js4') 
     
    183183>>> w8 = MyWidget8() 
    184184>>> print w8.media 
    185 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    186 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    187 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    188 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    189 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    190 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    191 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     185<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     186<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     187<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     188<script type="text/javascript" src="/path/to/js1"></script> 
     189<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     190<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     191<script type="text/javascript" src="/path/to/js4"></script> 
    192192 
    193193# If a widget extends another but defines media, it extends the parents widget's media, 
     
    202202>>> w9 = MyWidget9() 
    203203>>> print w9.media 
    204 <link href="http://media.example.com/some/path" type="text/css" media="all" rel="stylesheet" /> 
    205 <link href="http://media.example.com/other/path" type="text/css" media="all" rel="stylesheet" /> 
    206 <script type="text/javascript" src="http://media.example.com/some/js"></script> 
    207 <script type="text/javascript" src="http://media.example.com/other/js"></script> 
     204<link href="/some/path" type="text/css" media="all" rel="stylesheet" /> 
     205<link href="/other/path" type="text/css" media="all" rel="stylesheet" /> 
     206<script type="text/javascript" src="/some/js"></script> 
     207<script type="text/javascript" src="/other/js"></script> 
    208208 
    209209# A widget can disable media inheritance by specifying 'extend=False' 
     
    212212...         extend = False 
    213213...         css = { 
    214 ...            'all': ('/path/to/css3','/path/to/css1') 
     214...            'all': ('/path/to/css3','path/to/css1') 
    215215...         } 
    216216...         js = ('/path/to/js1','/path/to/js4') 
     
    218218>>> w10 = MyWidget10() 
    219219>>> print w10.media 
    220 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    221 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    222 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    223 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     220<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     221<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     222<script type="text/javascript" src="/path/to/js1"></script> 
     223<script type="text/javascript" src="/path/to/js4"></script> 
    224224 
    225225# A widget can explicitly enable full media inheritance by specifying 'extend=True' 
     
    228228...         extend = True 
    229229...         css = { 
    230 ...            'all': ('/path/to/css3','/path/to/css1') 
     230...            'all': ('/path/to/css3','path/to/css1') 
    231231...         } 
    232232...         js = ('/path/to/js1','/path/to/js4') 
     
    234234>>> w11 = MyWidget11() 
    235235>>> print w11.media 
    236 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    237 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    238 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    239 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    240 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    241 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    242 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     236<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     237<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     238<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     239<script type="text/javascript" src="/path/to/js1"></script> 
     240<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     241<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     242<script type="text/javascript" src="/path/to/js4"></script> 
    243243 
    244244# A widget can enable inheritance of one media type by specifying extend as a tuple 
     
    247247...         extend = ('css',) 
    248248...         css = { 
    249 ...            'all': ('/path/to/css3','/path/to/css1') 
     249...            'all': ('/path/to/css3','path/to/css1') 
    250250...         } 
    251251...         js = ('/path/to/js1','/path/to/js4') 
     
    253253>>> w12 = MyWidget12() 
    254254>>> print w12.media 
    255 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    256 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    257 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    258 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    259 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     255<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     256<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     257<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     258<script type="text/javascript" src="/path/to/js1"></script> 
     259<script type="text/javascript" src="/path/to/js4"></script> 
    260260 
    261261############################################################### 
     
    275275>>> multimedia = MultimediaWidget() 
    276276>>> print multimedia.media 
    277 <link href="http://media.example.com/file4" type="text/css" media="print" rel="stylesheet" /> 
    278 <link href="http://media.example.com/file3" type="text/css" media="screen" rel="stylesheet" /> 
    279 <link href="http://media.example.com/file1" type="text/css" media="screen, print" rel="stylesheet" /> 
    280 <link href="http://media.example.com/file2" type="text/css" media="screen, print" rel="stylesheet" /> 
    281 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    282 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     277<link href="/file4" type="text/css" media="print" rel="stylesheet" /> 
     278<link href="/file3" type="text/css" media="screen" rel="stylesheet" /> 
     279<link href="/file1" type="text/css" media="screen, print" rel="stylesheet" /> 
     280<link href="/file2" type="text/css" media="screen, print" rel="stylesheet" /> 
     281<script type="text/javascript" src="/path/to/js1"></script> 
     282<script type="text/javascript" src="/path/to/js4"></script> 
    283283 
    284284############################################################### 
     
    295295>>> mymulti = MyMultiWidget() 
    296296>>> print mymulti.media    
    297 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    298 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    299 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    300 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    301 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    302 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    303 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     297<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     298<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     299<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     300<script type="text/javascript" src="/path/to/js1"></script> 
     301<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     302<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     303<script type="text/javascript" src="/path/to/js4"></script> 
    304304 
    305305############################################################### 
     
    313313>>> f1 = MyForm() 
    314314>>> print f1.media 
    315 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    316 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    317 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    318 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    319 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    320 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    321 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     315<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     316<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     317<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     318<script type="text/javascript" src="/path/to/js1"></script> 
     319<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     320<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     321<script type="text/javascript" src="/path/to/js4"></script> 
    322322 
    323323# Form media can be combined to produce a single media definition. 
     
    326326>>> f2 = AnotherForm() 
    327327>>> print f1.media + f2.media 
    328 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    329 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    330 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    331 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    332 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    333 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    334 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
     328<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     329<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     330<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     331<script type="text/javascript" src="/path/to/js1"></script> 
     332<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     333<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     334<script type="text/javascript" src="/path/to/js4"></script> 
    335335 
    336336# Forms can also define media, following the same rules as widgets. 
     
    345345>>> f3 = FormWithMedia() 
    346346>>> print f3.media 
    347 <link href="http://media.example.com/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
    348 <link href="http://media.example.com/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
    349 <link href="http://media.example.com/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
    350 <link href="http://media.example.com/some/form/css" type="text/css" media="all" rel="stylesheet" /> 
    351 <script type="text/javascript" src="http://media.example.com/path/to/js1"></script> 
    352 <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
    353 <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
    354 <script type="text/javascript" src="http://media.example.com/path/to/js4"></script> 
    355 <script type="text/javascript" src="http://media.example.com/some/form/javascript"></script> 
     347<link href="http://media.example.com/media/path/to/css1" type="text/css" media="all" rel="stylesheet" /> 
     348<link href="/path/to/css2" type="text/css" media="all" rel="stylesheet" /> 
     349<link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> 
     350<link href="/some/form/css" type="text/css" media="all" rel="stylesheet" /> 
     351<script type="text/javascript" src="/path/to/js1"></script> 
     352<script type="text/javascript" src="http://media.other.com/path/to/js2"></script> 
     353<script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> 
     354<script type="text/javascript" src="/path/to/js4"></script> 
     355<script type="text/javascript" src="/some/form/javascript"></script> 
    356356 
    357357"""