5

Я использую django-crispy-forms (http://django-crispy-forms.readthedocs.org/), и я пытаюсь использовать загрузку файла Jasny Bootstrap (http://jasny.github.io/bootstrap/javascript.html#fileupload), чтобы сделать мою веб-страницу более приятной.django-crispy-forms для jasny file upload

Насколько я знаю, хрустящие формы из коробки не поддерживают загрузку файла Jasny. Поскольку я не очень опытен, я пытаюсь использовать все, что доступно в хрустящих формах, а не создавать свои собственные объекты макета. Тем не менее, я пробовал уже несколько дней, и это не сработает.

Я знаю, что это неправильный способ сделать это, но моя попытка до сих пор заключалась в том, чтобы попытаться использовать Div в форме Crispy-формы в forms.py, чтобы django сгенерировал нечто похожее на примерный код для загрузки файла Jasny.

код из Jasny загрузки файла:

<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> 

Отрывок из моего forms.py:

 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' 
     ), 

Это очень некрасиво код и он не работает, потому что я до сих пор получить оригинальный «Выбрать Файл "в новых кнопках.

Я очень благодарен всем, кто может помочь! Я получаю очень разочарованы и вытаскивая много волос, пытаясь сделать эту работу :(

Большое спасибо.

ответ

3

Я думал, что я разделю мое решение, основанное на нескольких других SO ответов.

Во-первых, не следует пытаться использовать макет из Хрустящие форм, так как HTML из Jasny является слишком отличается от шаблона Crispy Form по умолчанию. Сначала мы создаем съел шаблон Crispy Form, который работает с Jasny. Это в основном только шаблон field.html, обновленный с помощью Jasny 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', 
     ) 

В-третьих, по умолчанию не существует никакого способа, чтобы легко очистить изображение с Ясным и Джанго. Вы можете найти резюме поведения Ясного 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 выше был слегка измененный, чтобы включить идентификаторы для интересующих тегов, чтобы облегчить выбор.

Кажется, что много работы, но как только это сделано, его просты в использовании, как простые хрустящие формы.

+0

Обратите внимание, что самая последняя версия хрустящих форм затрудняет ссылку на настраиваемый шаблон из-за форматирования строки. Мне пришлось изменить ссылку на шаблон «template = '% s/file_field.html» и поместить файл file_field.html в папку bootstrap3 на пути к шаблону. – freb

+0

Я выполнил тот же подход для ClearableFileInput. Хотя это боль, на данный момент это единственный разумный вариант, так как все мое приложение основано на хрустящих формах (изменение его сейчас и внедрение форм вручную потребует много времени, возможно, в будущем :-)). – 4ndr23j