5

私はdjango-crispy-forms(http://django-crispy-forms.readthedocs.org/)を使用しています。私のウェブページを見栄え良くするためにJasny Bootstrapファイルのアップロード(http://jasny.github.io/bootstrap/javascript.html#fileupload)を使用しようとしています。jasnyファイルのアップロードのためのdjango-crispy-forms

私が知っている限り、Crispyフォームは、そのままの状態でJasnyファイルのアップロードをサポートしていません。私はあまり経験していないので、私自身のレイアウトオブジェクトを作成するのではなく、クリスピーフォームで使用できるものを使用しようとしています。しかし、私は数日間試しましたが、うまくいきません。

これは正しい方法ではないことが分かっていますが、これまでのところ、forms.pyのCrispy-formのDivを使って、Jasnyファイルアップロードのサンプルコードと似たものを生成するようにしています。 Jasnyファイルのアップロードから

コード:

 Div(
      HTML("""<div class="fileupload fileupload-new" data-provides="fileupload"> 
<div class="fileupload-new thumbnail" style="width: 200px; height: 150px;"><img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&text=no+image" /></div> 
     <div class="fileupload-preview fileupload-exists thumbnail" style="max-width: 200px; max-height: 150px; line-height: 20px;"></div> 
     <div class"smalltest"> 
      <span class="btn btn-file"><span class="fileupload-new">Select image</span><span class="fileupload-exists">Change</span> 
    """), 
      Field('photo1'), 
      HTML("""</span><a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a></div></div>"""), 
      css_class = 'photofield' 
     ), 

それは非常に醜いコードであると、私はまだ元を取得するので、それは、動作しません「を選択します:私のforms.pyから

<div class="fileupload fileupload-new" data-provides="fileupload"> 
    <div class="fileupload-new thumbnail" style="width: 200px; height: 150px;"><img src="http://www.placehold.it/200x150/EFEFEF/AAAAAA&text=no+image" /></div> 
    <div class="fileupload-preview fileupload-exists thumbnail" style="max-width: 200px; max-height: 150px; line-height: 20px;"></div> 
    <div> 
     <span class="btn btn-file"><span class="fileupload-new">Select image</span><span class="fileupload-exists">Change</span><input type="file" /></span> 
    <a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a> 
    </div> 
</div> 

抜粋新しいボタンの中の「ファイル」ボタンをクリックします。

私は助けることができる誰にとっても非常に感謝しています!私はかなりイライラ取得し、この作品:(

感謝をしようとたくさんの毛を引き出してきた。

答えて

3

私はいくつかの他のSOの回答に基づいて私の解決策を共有しようと思いました。

まずJasnyからHTMLであるため、あなたはクリスピーフォームからレイアウトを試してみて、使用しないでください既定のクリスピーフォームテンプレートとあまりにも異なっています。 Jasnyと一緒に働くCrispy Formテンプレートを食べました。これは、基本的にJasny HTMLで更新されたfield.htmlテンプレートです。

file_field.html:

{# Custom Crispy Forms template for rendering an image field. #} 
{% load crispy_forms_field %} 

{% if field.is_hidden %} 
    {{ field }} 
{% else %} 
    {% if field|is_checkbox %} 
     <div class="form-group"> 
     {% if label_class %} 
      <div class="controls col-{{ bootstrap_device_type }}-offset-{{ label_size }} {{ field_class }}"> 
     {% endif %} 
    {% endif %} 
    <{% if tag %}{{ tag }}{% else %}div{% endif %} id="div_{{ field.auto_id }}" {% if not field|is_checkbox %}class="form-group{% else %}class="checkbox{% endif %}{% if wrapper_class %} {{ wrapper_class }}{% endif %}{% if form_show_errors%}{% if field.errors %} has-error{% endif %}{% endif %}{% if field.css_classes %} {{ field.css_classes }}{% endif %}"> 
     {% if field.label and not field|is_checkbox and form_show_labels %} 
      <label for="{{ field.id_for_label }}" class="control-label {{ label_class }}{% if field.field.required %} requiredField{% endif %}"> 
       {{ field.label|safe }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %} 
      </label> 
     {% endif %} 

     {% if field|is_checkboxselectmultiple %} 
      {% include 'bootstrap3/layout/checkboxselectmultiple.html' %} 
     {% endif %} 

     {% if field|is_radioselect %} 
      {% include 'bootstrap3/layout/radioselect.html' %} 
     {% endif %} 

     {% if not field|is_checkboxselectmultiple and not field|is_radioselect %} 
      {% if field|is_checkbox and form_show_labels %} 
       <label for="{{ field.id_for_label }}" class="{% if field.field.required %} requiredField{% endif %}"> 
        {% crispy_field field %} 
        {{ field.label|safe }} 
        {% include 'bootstrap3/layout/help_text_and_errors.html' %} 
       </label> 
      {% else %} 
       <div class="controls {{ field_class }}"> 
        <div class="fileinput fileinput-{% if field.value and field.value.url %}exists{% else %}new{% endif %}" data-provides="fileinput"> 
        <div class="fileinput-new thumbnail" style="width: 200px; height: 150px;"> 
         <img data-src="holder.js/100%x100%" alt="100%x100%" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOTAiIGhlaWdodD0iMTQwIj48cmVjdCB3aWR0aD0iMTkwIiBoZWlnaHQ9IjE0MCIgZmlsbD0iI2VlZSIvPjx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk1IiB5PSI3MCIgc3R5bGU9ImZpbGw6I2FhYTtmb250LXdlaWdodDpib2xkO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OkFyaWFsLEhlbHZldGljYSxzYW5zLXNlcmlmO2RvbWluYW50LWJhc2VsaW5lOmNlbnRyYWwiPjE5MHgxNDA8L3RleHQ+PC9zdmc+" style="height: 100%; width: 100%; display: block;"> 
        </div> 
        <div class="fileinput-preview fileinput-exists thumbnail" style="max-width: 200px; max-height: 150px; line-height: 10px;"> 
         {% if field.value and field.value.url %} 
         <img src="{{ field.value.url }}"> 
         {% endif %} 
        </div> 
        {# imgfileinput, imgselect, imremove used for removing image #} 
        <div id="imgfileinput"> 
         <span id="imgselect" class="btn btn-default btn-file"> 
         <span class="fileinput-new">Select image</span> 
         <span class="fileinput-exists">Change</span> 
         <input id="imgfile" type="file" name="{{ field.name }}"> 
         </span>&nbsp 
         <a id="imgremove" href="#" class="btn btn-default fileinput-exists" data-dismiss="fileinput">Remove</a> 
        </div> 
        </div> 

        {# removed {% crispy_field field %} #} 
        {% include 'bootstrap3/layout/help_text_and_errors.html' %} 
       </div> 
      {% endif %} 
     {% endif %} 
    </{% if tag %}{{ tag }}{% else %}div{% endif %}> 
    {% if field|is_checkbox %} 
     {% if label_class %} 
      </div> 
     {% endif %} 
     </div> 
    {% endif %} 
{% endif %} 

第二に、フォームのレイアウトを定義する際にテンプレートを参照:

from crispy_forms.layout import Layout, Fieldset, Div, Submit, Reset, HTML, Field, Hidden 
class UserForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(UserForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper() 
     self.helper.layout = Layout(
      Field('avatar', template='file_field.html'), 
      'username', 
      'first_name', 
      'last_name', 
     ) 

第三には、デフォルトでは簡単に画像をクリアする方法はありませんジャスニーとジャンゴと一緒に。 Jasnyの動作の概要はhereです。基本的に、Jasnyは、画像が更新または削除されていないかどうかに応じて、Noneまたは空文字列を送信します。 Djangoはこれらの両方を、更新されていないイメージとして解釈します。イメージは削除されません。

DjangoはClearableFileInputウィジェットを使用して、ファイルを削除する場合に選択するチェックボックスを追加します。この機能を模倣するために、私はちょうど変更またはボタンを挿入を選択したときに削除ボタンが選択されている場合、この入力を追加し、入力を削除するには、いくつかのjQueryを追加しました:

<script> 
    // Allow image to be deleted 
    $('#imgremove').on('click', function() { 
    field_name = $('#imgfile')[0].getAttribute('name'); 
    $('#imgfileinput').append('<input id="imgclear" type="hidden" name="'+field_name+'-clear" value="on">'); 
    }) 
    $('#imgselect').on('click', function() { 
    $('#imgclear').remove(); 
    }) 
</script> 

あなたは私のJasny HTMLは、上記されているがわかります関心のあるタグのIDを含むように少し修正して、より簡単に選択できるようにしました。

多くの仕事のように見えますが、いったん完成すれば、プレーンクリスピーのような使いやすいものです。

+0

最新のバージョンの新鮮なフォームでは、文字列の書式設定のためにカスタムテンプレートを参照するのが難しくなります。テンプレート参照を「template = '%s/file_field.html'」に変更し、file_field.htmlファイルをテンプレートパス上のbootstrap3フォルダに配置する必要がありました。 – freb

+0

私はClearableFileInputに同じアプローチをしました。それは痛みですが、当面は私のアプリケーション全体が鮮明なフォームに基づいているため、唯一の合理的なオプションです(今すぐ変更して手動でフォームを実装するには、多分時間がかかります。 – 4ndr23j

関連する問題