2012-05-30 110 views
4

我有一个模型和一个窗体(forms.ModelForm),我有一个ImageField。该模型类似于:Django 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)'的代码,但是我想知道是否可以实现这一点。

赞赏任何帮助或建议。

现在我已经看过的代码“类ClearableFileInput(的FileInput)”

回答

1

我把这个到模板形式

{% if business.business_image %} 
    <img src="{{ business.business_image.url }}" title="{{ business.business_name}}" /> 
{% endif %} 
+0

是的,这将显示图像在t模板,但我提到的2个项目,当前:和更改:仍然在模板中。 – Henri

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()) 
0

这是我的一个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)