2014-01-12 4 views
3

Я хотел бы отобразить изображение с ImageField. Я использую Django crispy forms. Кажется, мне нужно использовать помощник макета HTML, но я не уверен, как получить доступ к переменной шаблона здесь.ImageField Предварительный просмотр в хрустом форме макета

Следующая делает пустой тег изображения:

HTML('<img src="{{ logo.url }}" />') 

Могу ли я ссылающийся это неправильно, или есть лучший способ в хрустящей формах?

Вот полный код, так что вы можете получить лучшее представление:

forms.py

class CompanyForm(forms.Form): 
    name = forms.CharField(required=False, label="Company name") 
    logo = forms.ImageField(required=False, label="Logo") 

    # form layout 
    helper = FormHelper() 
    helper.form_class = 'form-horizontal' 
    helper.layout = Layout(
     Div(
      'name', 
      HTML('<img src="{{ logo.url }}" />'), 
      css_class='span4', 
     ), 

     FormActions(
      Submit('submit', 'Save', css_class="btn-primary pull-right"), 
     ) 
    ) 

models.py

class Company(models.Model): 
    name = models.CharField(max_length=100) 
    logo = models.ImageField(upload_to = 'logos/', null=True) 

views.py

Я устанавливаю начальные значения формы, на мой взгляд:

... 
profile = Company.objects.get(name="foo") 
form = CompanyForm(initial={'name': profile.name, 'logo': profile.logo, }) 

context = { 
    'profile_form' : form, 
} 

return render_to_response('dashboard/company-profile.html', context_instance=RequestContext(request, context))  

компания-profile.html

{% load crispy_forms_tags %} 
<div class="row"> 
    {% crispy profile_form %} 
</div> 

ответ

11

Забавно, я просто работал по тому же вопросу сегодня на Встроенный модуль для загрузки изображений, я закончил эту реализацию:

class ImageModelForm(forms.ModelForm): 

    class Meta: 
     model = ImageModel 

    def __init__(self, *args, **kwargs): 
     super(ImageModelForm, self).__init__(*args, **kwargs) 
     self.helper = FormHelper(self) 
     self.helper.form_tag = False 
     self.helper.disable_csrf = True 
     self.helper.layout = Layout(
      'title', 
      'description', 
      'imagefile', 
      HTML("""{% if form.imagefile.value %}<img class="img-responsive" src="{{ MEDIA_URL }}{{ form.imagefile.value }}">{% endif %}""",), 
      'flag_featured', 
     ) 
+0

Отлично! Большое спасибо! – Banjer

+0

Одна вещь состоит в том, что после отправки формы img разбивается, когда страница загружается. Если я нажму на перезагрузку на странице, тогда она появится нормально. У вас есть эта проблема? Это связано с тем, что img src является '/ media/myfile.jpg' после отправки формы. На перезагрузке страницы он корректно обрабатывается как '/ media/logos/myfile.jpg'. Это потому, что файл не загружается, когда страница возвращается из формы? Является ли родительский каталог мультимедиа местом загрузки темпа или чем-то еще? Возможно, есть другой атрибут, который я могу захватить вместо 'form.imagefile.value'? – Banjer

0

далее, чтобы ответить @petkostas, в частности, на Изображение перезарядка комментарий от @Banjer: - я также имел эту проблему с формой и удалось решить эту проблему путем введения условного оператора в views.py (примечание, контекст заявления не включены ниже):

if request.method == "POST": 
     if form.is_valid(): 
      #do stuff 
     return HttpResponseRedirect(reverse('your_named_url')) 
elif request.method =="GET": 
     return render(request, 'path/to/template.html', context) 

что это Это позволяет перезагружать страницу новым содержимым, если оно обновлено (так что вы можете использовать атрибут form.imagefile.value, упомянутый ранее)

! это довольно конкретный вариант использования, но я надеюсь, что это поможет кому-то сэкономить немного времени.

Смежные вопросы