10

のモデルがありFileFieldます。FileFieldビューでこのモデルを編集するときに、ビュー フォームに表示される「現在の」値を変更したいと考えています。説明させてください。

models.py:

class DemoVar_model(models.Model):
    ...
    Welcome_sound=models.FileField(upload_to='files/%Y/%m/%d')

フォーム.py:

class DemoVar_addform(ModelForm):
    ...
    class Meta:
        model = DemoVar_model        

ビュー.py:

soundform = DemoVar_addform(instance=ivrobj)
....
return render_to_response(template,{'soundform':soundform}, ....)

今、私は自分のビューでこのモデルを編集したいと考えています。ブラウザを見ると、フォームが次のように表示されているのがわかります

Welcome sound: Currently: welcome_files/2011/04/27/15_35_58_ojCompany.wav.mp3 
Change : <Choose File button>

この「現在」の値を変更したいと考えています。これは、ファイルがサーバー上に存在するときのファイルのパス全体を示しています。この文字列をパスなしでファイル名だけにトリミングしたい。どうすればそれを達成できますか?

4

4 に答える 4

12

表示方法を変更するには、現在使用されている ClearableFileInput をオーバーライドする必要があります。

ファイル名のみを表示するように 19 行目を変更しただけでShortNameFileInput、デフォルトを継承する新しいコードを次に示します。ClearableFileInput

from django.forms.widgets import ClearableFileInput
import os
# missing imports
from django.utils.safestring import mark_safe
from cgi import escape
from django.utils.encoding import force_unicode

class ShortNameClarableFileInput(ClearableFileInput):
    def render(self, name, value, attrs=None):
        substitutions = {
            'initial_text': self.initial_text,
            'input_text': self.input_text,
            'clear_template': '',
            'clear_checkbox_label': self.clear_checkbox_label,
        }
        template = u'%(input)s'
        substitutions['input'] = super(ClearableFileInput, self).render(name, value, attrs)

        if value and hasattr(value, "url"):
            template = self.template_with_initial
            substitutions['initial'] = (u'<a href="%s">%s</a>'
                                        % (escape(value.url),
                                           escape(force_unicode(os.path.basename(value.url))))) # I just changed this line
            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)

フォームで使用するには、使用するウィジェットを手動で設定する必要があります。

class DemoVar_addform(ModelForm):
    ...
    class Meta:
        model = DemoVar_model
        widgets = {
            'Welcome_sound': ShortNameClarableFileInput,
        }                    

これでうまくいくはずです。

于 2011-04-28T12:03:40.790 に答える
1

それを行う 1 つの方法は、カスタム フォーム ウィジェットを作成し、render メソッドをオーバーライドすることです。

于 2011-04-28T00:06:11.867 に答える