Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:编辑模型时自定义文件字段值_Python_Django_File Upload_Django Forms_Django File Upload - Fatal编程技术网

Python Django:编辑模型时自定义文件字段值

Python Django:编辑模型时自定义文件字段值,python,django,file-upload,django-forms,django-file-upload,Python,Django,File Upload,Django Forms,Django File Upload,我有一个模型,带有FileField。在视图中编辑此模型时,我希望更改视图窗体中显示的FileField的“当前”值。让我解释一下 型号。py: class DemoVar_model(models.Model): ... Welcome_sound=models.FileField(upload_to='files/%Y/%m/%d') class DemoVar_addform(ModelForm): ... class Meta: mode

我有一个模型,带有
FileField
。在视图中编辑此模型时,我希望更改视图窗体中显示的
FileField
的“当前”值。让我解释一下

型号。py:

class DemoVar_model(models.Model):
    ...
    Welcome_sound=models.FileField(upload_to='files/%Y/%m/%d')
class DemoVar_addform(ModelForm):
    ...
    class Meta:
        model = DemoVar_model        
soundform = DemoVar_addform(instance=ivrobj)
....
return render_to_response(template,{'soundform':soundform}, ....)
forms.py:

class DemoVar_model(models.Model):
    ...
    Welcome_sound=models.FileField(upload_to='files/%Y/%m/%d')
class DemoVar_addform(ModelForm):
    ...
    class Meta:
        model = DemoVar_model        
soundform = DemoVar_addform(instance=ivrobj)
....
return render_to_response(template,{'soundform':soundform}, ....)
视图。py:

class DemoVar_model(models.Model):
    ...
    Welcome_sound=models.FileField(upload_to='files/%Y/%m/%d')
class DemoVar_addform(ModelForm):
    ...
    class Meta:
        model = DemoVar_model        
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>
欢迎声音:当前:Welcome_files/2011/04/27/15_35_58_ojCompany.wav.mp3
更改:

我想更改这个“current”值,它描述了文件在我的服务器上退出时的整个路径。我想把这个字符串修剪成没有路径的文件名。如何实现这一点?

一种方法是编写自定义表单小部件并覆盖呈现方法。

您需要覆盖当前使用的ClearableFileInput,以更改其显示方式

下面是新的
ShortNameFileInput
的代码,它继承了默认的
ClearableFileInput
,只在第19行进行了更改,仅显示文件名:

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)

这应该可以解决问题。

如果您想要一种更简单的方法,并且避免重写小部件的渲染逻辑,您可以做一些修改

from os import path
from django import forms


class FormatString(str):

    def format(self, *args, **kwargs):
        arguments = list(args)
        arguments[1] = path.basename(arguments[1])
        return super(FormatString, self).format(*arguments, **kwargs)


 class ClearableFileInput(forms.ClearableFileInput):

     url_markup_template = FormatString('<a href="{0}">{1}</a>')
Django 1.10.x或更早版本

最简单的方法是覆盖默认
ClearableFileInput
django小部件中的
template\u substitution\u值
,该小部件稍后将用于呈现表单。这是一种更干净的方法,不会导致任何不必要的代码重复

from os import path
from django.forms.widgets import ClearableFileInput
from django.utils.html import conditional_escape

class CustomClearableFileInput(ClearableFileInput):
    def get_template_substitution_values(self, value):
        """
        Return value-related substitutions.
        """
        return {
            'initial': conditional_escape(path.basename(value.name)),
            'initial_url': conditional_escape(value.url),
        }
然后使用forms.py中的小部件,如下所示:

class DemoVar_addform(ModelForm):
    Welcome_sound = forms.FileField(widget=CustomClearableFileInput)    
    ...

    class Meta:
        model = DemoVar_model

    ...
Django 1.11.x或更高版本

检查。

为什么我不能从FileInput派生而不是ClearableFileInput?这是一种比公认答案更干净的方法,不会导致任何不必要的代码重复。我尝试过这种方法,但“当前”没有任何修剪文件路径的情况。我在这里提出我的问题:@DhiaTN