我有一个模型和一个表单(forms.ModelForm),我有一个ImageField。该模型类似于:
class Business(models.Model):
business_name = models.CharField(max_length=128)
.
.
business_image = ImageField(
max_length=128,
upload_to=upload_business_image_handler,
height_field='business_image_height',
width_field='business_image_width'
)
business_image_height = models.IntegerField(blank=True, null=True)
business_image_width = models.IntegerField(blank=True, null=True)
.
.
随附表格:
class BusinessForm(forms.ModelForm):
def __init__(self, data=None, files=None, branch_list = None, country_list = None, *args, **kwargs):
super(BusinessForm, self).__init__(data, *args, **kwargs)
# create the MultipleChoiceField choice_list based on language
self.fields['branch'].choices = branch_list
self.fields['country'].choices = country_list
self.postdata = data
self.files = files
business_name = forms.CharField(widget=forms.TextInput(attrs={'size':'50', 'class': 'address'}), required=True)
#business_image = forms.ImageField(widget=forms.ClearableFileInput())
表单中的最后一行被注释掉了,因为forms.ClearableFileInput()是FileFields和ImageFields的默认小部件。
现在,当此表单用于编辑现有记录时,模板中的图像显示如下:
Currently: <image_url>
Change: <browse_button>
我想更改文字标签“当前”和“更改”,而不是显示image_url我想要显示图片。
当然我可以复制和修改'site-packages / django / forms / widgets.py'中的'class ClearableFileInput(FileInput)'的代码,但我想知道这是否是实现此目的的方法。
感谢任何帮助或建议。
现在我看了'class ClearableFileInput(FileInput)'的代码
答案 0 :(得分:3)
以下是我对同一问题的解决方案。
from django.utils.safestring import mark_safe
from django.utils.html import escape, conditional_escape
from django.utils.encoding import force_unicode
from django.forms.widgets import ClearableFileInput, Input, CheckboxInput
class CustomClearableFileInput(ClearableFileInput):
def render(self, name, value, attrs=None):
substitutions = {
#uncomment to get 'Currently'
'initial_text': "", # self.initial_text,
'input_text': self.input_text,
'clear_template': '',
'clear_checkbox_label': self.clear_checkbox_label,
}
template = '%(input)s'
substitutions['input'] = Input.render(self, name, value, attrs)
if value and hasattr(value, "url"):
template = self.template_with_initial
substitutions['initial'] = ('<img src="%s" alt="%s"/>'
% (escape(value.url),
escape(force_unicode(value))))
if not self.is_required:
checkbox_name = self.clear_checkbox_name(name)
checkbox_id = self.clear_checkbox_id(checkbox_name)
substitutions['clear_checkbox_name'] = conditional_escape(checkbox_name)
substitutions['clear_checkbox_id'] = conditional_escape(checkbox_id)
substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id})
substitutions['clear_template'] = self.template_with_clear % substitutions
return mark_safe(template % substitutions)
然后只使用扩展小部件:
business_image = forms.ImageField(widget=CustomClearableFileInput())
答案 1 :(得分:1)
我把它放到模板表格中
{% if business.business_image %}
<img src="{{ business.business_image.url }}" title="{{ business.business_name}}" />
{% endif %}
答案 2 :(得分:1)
这是我的imageInput版本,显示图像并且不允许清除图像
只需在表单类中指定该字段具有widget=NonClearableImageInput()
from django.forms.widgets import FileInput
from django.utils.html import conditional_escape
from django.utils.safestring import mark_safe
class NonClearableImageInput(FileInput):
def render(self, name, value, attrs=None):
template = '%(input)s'
data = {'input': None, 'url': None}
data['input'] = super(NonClearableImageInput, self).render(name, value, attrs)
if hasattr(value, 'url'):
data['url'] = conditional_escape(value.url)
template = '%(input)s <img src="%(url)s">'
return mark_safe(template % data)