2015-01-13 2 views
5

私のDjango ファイルのアップロードボタンのスタイルを変更しようとしていますが、フォームを通して処理され、テンプレート内のHTMLに明示的に記述されていないため、他のボタンのようにHTMLやCSSで直接スタイルできません。Djangoのファイルピッカーフォームボタンをどのようにスタイルできますか?

CSSクラスをforms.pyに追加しようとしましたが、バニラのデフォルトのDjangoファイルのアップロードボタンをCSSスタイルのボタンの上に配置しています。次のように

私のコードは次のとおりです。

class FileUploadForm(forms.Form): 
    docFile = forms.FileField(
     label = "Select a CSV file", 
    ) 

    class Meta: 
     model = FileUpload 
     fields = ('docFile') 

    def __init__(self, *args, **kwargs): 
     super(FileUploadForm, self).__init__(*args, **kwargs) 
     self.fields['docFile'].widget.attrs.update({'class': 'my_class'}) 

また、私はそうのように私のMetaクラス内widgetを定義しようとした:

class Meta: 
     model = FileUpload 
     widgets = { 
      'docFile': forms.FileInput(attrs={'class': 'my_class'}), 
     } 

が、それは私の最初の試みと同様の効果がありました。

これを達成する別の方法がありますか、またはコード内で見つけることができるいくつかの論理エラーがありますか?

+0

ただ、具体的には...あなたは、このクラスは、レンダリングされたHTML(Djangoの問題)に追加表示されない問題がありますか?または、デフォルトでCSSの設定を上書きできませんか(CSSの問題)? – dylrei

+0

カスタムCSSが表示されますが、ファイルピッカーを起動するデフォルトの[ファイルアップロード]ボタンがCSSスタイルの上に配置されるという問題があります。だから、それはCSSやDjango側の両方で問題になる可能性があります。 –

+0

だから...あなたは、レンダリングされたフォームのHTMLソースを見て、あなたのボタンはmy_classのクラスを持っていますか?その後、CSSの問題です。考えられる解決方法には、後でCSSを読み込む方法や!重要なオプションを追加する方法、またはテンプレートの下部にある簡単なJS呼び出しを使用してボタンに異なるスタイルを適用する方法などがあります。 – dylrei

答えて

3

ここでは、Bootstrap hereを使って見つけた解決策を紹介します。

.fileUpload { 
 
\t position: relative; 
 
\t overflow: hidden; 
 
\t margin: 10px; 
 
} 
 
.fileUpload input.upload { 
 
\t position: absolute; 
 
\t top: 0; 
 
\t right: 0; 
 
\t margin: 0; 
 
\t padding: 0; 
 
\t font-size: 20px; 
 
\t cursor: pointer; 
 
\t opacity: 0; 
 
\t filter: alpha(opacity=0); 
 
}
<link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet"/> 
 
<div class="fileUpload btn btn-primary"> 
 
    <span>Upload</span> 
 
    <input type="file" class="upload" /> 
 
</div>

1

ファイルアップロードボタンをスタイルする場合は、別のボタンまたはリンクを定義し、そのスタイルを設定します。次に、ファイルアップロードボタンをトリガーするクリックイベントを設定します。

HTML:

<div> 
    <a id="browse" class="my_class">Browse</a> 
    <input type="file" name="data" style="display: none" /> 
</div> 

Javascriptを:

$('#browse').click(function(){ 
    $(this).parent().find('input').click(); 
}); 

あなたはwidgetでそれを行うことができますDjangoのフォームでこの仕事をするために。

+0

元の質問に示されているように 'ウィジェット 'を使ってみましたしかし、私の '__init __()'関数で属性を定義したときと同じ結果になりました。 –

+0

私は上記のhtmlとjsを持つカスタムウィジェットを意味しました。 – nima

関連する問題