【问题标题】:django file upload - hide the currently displayed image link in the edit templatedjango 文件上传 - 在编辑模板中隐藏当前显示的图片链接
【发布时间】:2015-04-19 04:40:50
【问题描述】:

我有一个测试模板,允许用户将上传的文件图像以及图像标题作为字符字段添加到用户帐户。这工作正常。

我现在正在尝试允许用户编辑已上传的文件图像和图像标题详细信息。

是否可以隐藏图片链接并在其位置显示图片?

我已经阅读了django docs,搜索了SO 和 Google,并且断断续续地工作了 2 1/2 天,但我仍然无法解决这个问题。

似乎有很多关于如何上传新文件图像的信息,而不是如何编辑已经上传的文件图像。

这是我的 models.py 代码:

def _get_document_upload_location(instance, filename):
"""
Using a function instead of a lambda to make migrations happy. DO NOT remove or rename this function in the future, as it will break migrations.
@param instance: model instance that owns the FileField we're generating the upload filename for.
@param filename: Original file name assigned by django.
"""
return 'attachments/%d/%s' % (instance.user.id, uuid.uuid4())

class AttachmentDetails(models.Model, FillableModelWithLanguageVersion):
    user = models.ForeignKey(User)
    language_version = models.ForeignKey('LanguageVersion')
    attachment_document = models.FileField(upload_to=_get_document_upload_location)
    attachment_title = models.CharField(null=False, blank=False, max_length=250)
    attachment_timestamp_added = models.DateTimeField(auto_now_add=True, auto_now=False)
    attachment_timestamp_updated = models.DateTimeField(auto_now=True, auto_now_add=False)

这是我的views.py文件代码:

def attachment_details_edit(request, attachment_details_id):
    try:
        attachment_details = AttachmentDetails.objects.get(pk=attachment_details_id, user=request.user)
    except AttachmentDetails.DoesNotExist:
        return redirect(settings.MENU_DETAIL_LINK_ATTACHMENT_DETAILS)
    language_versions = LanguageVersion.objects.filter(user=request.user).select_related('language_version')
    available_languages = get_available_language_details(language_versions, request.user.userprofile.language_preference)
    attachment_details_num = request.user.attachmentdetails_set.count()
    language_code = attachment_details.language_version.language_code
    language_code_disabled = attachment_details.language_version.language_code_disabled
    language_preference = request.user.userprofile.language_preference
    if language_code_disabled:
        return redirect(settings.MENU_DETAIL_LINK_ATTACHMENT_DETAILS)
    if request.method == 'GET':
        language_code = attachment_details.language_version.language_code
        form = AttachmentDetailsForm(
                available_languages,
                language_preference=request.user.userprofile.language_preference,
                file_required=False,
                initial=dict(
                    model_to_dict(attachment_details),
                    language_code=language_code
                )
        )
    elif request.method == 'POST':
        form = AttachmentDetailsForm(
            available_languages,
            language_preference,
            False,  # file_required
            request.POST,
            request.FILES
        )
        if form.is_valid():
            cd = form.cleaned_data
            if cd['attachment_document'] is not None:
                print 'removing previously uploaded file'
                attachment_details.attachment_document.delete(save=False)
            attachment_details.fill(cd)
            attachment_details.save()
            messages.success(request, _('successfully updated.'))
            return redirect(settings.MENU_DETAIL_LINK_ATTACHMENT_DETAILS)

编辑

这是我试图向用户隐藏的示例 - 代替链接,显示实际上传的文件图像。 下图是django admin,但我想隐藏链接,在编辑模板中显示上传的图片:

我有一个相关的帖子here

【问题讨论】:

  • 您的问题到底是什么?什么没有按预期工作?

标签: python django image file-upload


【解决方案1】:

要隐藏当前显示的图像链接,您可以简单地覆盖 get_context(下面是类似于 FileInput 的 ClearableFileInput 示例)。

在寻找此类解决方案时检查源代码非常有用。

Django 是一个开源模块,因此您可以在 GitHub 上查找源代码: https://github.com/django/django/blob/main/django/forms/widgets.py

class ClearableFileInputCustom(forms.ClearableFileInput):
    def get_context(self, name, value, attrs):
        context = super().get_context(name, value, attrs)
        context['widget']['is_initial'] = False
        return context

【讨论】:

    【解决方案2】:

    我在一个旧项目中使用了this snippet。这不是很好,因为您必须刷新页面/保存模型,但它可以满足您的需求。

    小部件:

    class AdminImageWidget(forms.FileInput):                                    
        """A ImageField Widget for admin that shows a thumbnail."""             
    
        def __init__(self, attrs={}):   # pylint: disable=E1002,W0102           
            super(AdminImageWidget, self).__init__(attrs)                       
    
        def render(self, name, value, attrs=None):  # pylint: disable=E1002     
            output = []                                                         
            css = {'style': 'clear:left;float:left;margin:1em 1em 0 0;'}        
            output.append(super(AdminImageWidget, self).render(name, value,     
                                                               attrs=css))      
            if value and hasattr(value, "url"):                                 
                output.append(('<a target="_blank" href="%s">'                  
                               '<img src="%s" alt="" '                          
                               'style="float:left;border:1px solid black;" /></a> '
                               % (value.url, value.url)))                       
            return mark_safe(u''.join(output)) 
    

    在管理员中使用它:

    class SomeAdminForm(forms.ModelForm):
        class Meta:
            model = MyModel
            widgets = {
                'my_image_field_name': AdminImageWidget(),
            }
    
    class SomeAdmin(admin.ModelAdmin):
        form = SomeAdminForm
    

    【讨论】:

      【解决方案3】:

      您必须在模板中设置 img 标记的 src 属性才能成功显示图像。

      <img src="{{attachment_details.file_url}}"/>
      

      {{attachment_details.file_url}} 当然必须替换为您要检索文件的网址。

      【讨论】:

      • nejc92,文件图像链接是从 python 代码动态创建的,所以我不能只将建议的模板代码放入模板中,因为这只会添加图像但不会替换实际的链接。我我认为必须在 python views.py 文件代码中替换链接。
      • 请查看官方 django 文档关于模板。当您在模板中使用这样的变量时:{{ variable_name}},它将被python代码中的实际值替换。
      • nejc92,我已经有&lt;img src="{{ attachment_details.attachment_document.url }}" /&gt;,它显示图像但不隐藏链接。**如何隐藏链接**如上面的帖子所示?
      • 你的问题我不清楚。您已成功显示图像,但链接仍然存在,您要删除它吗?只需从模板中删除 a 标签,链接就会消失
      • nejc92 - 我使用上面的一个 cmets 解决了这个问题。你没有为我提供实际的解决方案,但你确实为我指明了正确的方向,所以我给你赏金。谢谢,
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2017-09-28
      • 2015-04-21
      • 1970-01-01
      相关资源
      最近更新 更多