【问题标题】:Django modify FileField input button and label in Django formDjango 在 Django 表单中修改 FileField 输入按钮和标签
【发布时间】:2020-07-12 19:09:21
【问题描述】:

我正在尝试摆脱 Django 表单集中默认的常规文件上传视图,我的方法是现在隐藏输入文件,然后使用标签并使该标签可点击以上传文件,但是,现在单击我的标签后,无法上传任何内容,并且没有弹出选择文件窗口,我正在使用纯 CSS,目前我的 html 模板是:

HTML 表单

<form method="POST" data-url="{% url 'home:post-create' %}" class="post-create-form">
    {% csrf_token %}
        <div class="modal-header">
            <h5 class="modal-title" >Create a Post</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
            </button>
        </div>
    <div class="modal-body" style="overflow-y: auto;">
        {{ form|crispy }}
        <button type="button" id="show-image-upload-inputs" class="btn btn-sm mr-auto btn-primary pb-1">
            <span><i class="fas fa-camera"></i></span>
        </button>
        <div id="image-upload-div" class="mt-1 mx-1" style="display: none;">

                <div class="d-flex justify-content-center">
                    {% for a_form in formset %}
                    <div class="pl-1">
                        <label for="file"><i class="mt-2 fas fa-plus fa-5x"></i></label>
                        {{ a_form }}
                    </div>
                    {% endfor %}
                </div>


        </div>
    </div>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
        <button type="submit" class="btn btn-primary">Post</button>
    </div>
</form>


<style>
input[type='file'] {
    display: none;
}
label[for='file'] {
    padding-left: 2px;
    cursor: pointer;
    background-color: rgb(212, 231, 238);
    border: 1em;
    border-radius: 10px;
    width: 6em;
    height: 6em;
    text-align: center;
    opacity: 0.5;
    color:lightblue;
}
</style>

Django 视图

@login_required
def post_create(request):
    data = dict()
    ImageFormset = modelformset_factory(Images,form=ImageForm,extra=4)
    if request.method == 'POST':
        form = PostForm(request.POST)
        formset = ImageFormset(request.POST or None, request.FILES or None)
        if form.is_valid():    
            post = form.save(False)
            post.author = request.user
            #post.likes = None
            post.save()
            for f in formset:
                try:
                    i = Images(posts=post, image=f.cleaned_data['image'])
                    i.save()
                except Exception as e:
                    break
            data['form_is_valid'] = True
            posts = Post.objects.all()
            posts = Post.objects.order_by('-last_edited')
            data['posts'] = render_to_string('home/posts/home_post.html',{'posts':posts},request=request)
        else:
            data['form_is_valid'] = False
    else:
        form = PostForm  
        formset = ImageFormset(queryset=Images.objects.none())     
    context = {
    'form':form,
    'formset':formset,
    }
    data['html_form'] = render_to_string('home/posts/post_create.html',context,request=request)
    return JsonResponse(data) 

我想知道如何在 Django 表单中更改 FIleField?我想使用我当前的方法并覆盖由 Django 表单创建的标签,但是我不知道这是否是正确的选择。

【问题讨论】:

  • 首先这与 Django 或 FileField 无关。这是一个 HTML 文件输入字段。第二,“但是,点击我的标签后现在可以上传”是什么意思?真正的问题是什么?

标签: javascript html django django-templates


【解决方案1】:

当文件字段设置为display: nonevisibility: hidden 时,浏览器通常会阻止触发,尽管有一些技巧可以使用position: fixed/absolute; left:-10000px 将文件字段移到视口之外并使用JS 触发文件字段。

如果你想完全不使用 JS,你可以使用以下仅使用 HTML/CSS 的技巧:

form {
    position: relative;
    width: 100px;
    height: 30px;
}
input {
    position: absolute;
    height: 100%;
    width: 100%;
    opacity: 0;
    z-index: 1;
}

label {
    position: absolute;
    height: 100%;
    width: 100%;
    z-index: 0;

    /* Your styling here */
    border-radius: 10px;
    line-height: 30px;
    text-align: center;
    color: white;
    background-color: #0095ff;
}

input:hover + label {
    background-color: #0065ad;
}
<form>
    <input type='file' />
    <label>Upload File</label>
</form>

基本上你用文件字段覆盖你的自定义标签,并使文件字段透明。

【讨论】:

  • 您好,感谢您的解决方案。如何在视口外设置 FileField,我基本上应该向 div 添加一个可点击的操作并使用 JavaScript 触发它。这是您对使用 javascript 的建议吗? @grandphuba
  • 谢谢,我正在尝试实现,但问题是我不知道 Django 生成的输入字段的 ID,当表单集中有四个字段时,如何触发每个输入字段? @grandphuba
  • 你使用的是 jQuery(或一些库)还是纯 JS?
  • 不,我正在尝试使用 jQuery,但我无法设置正确的表单 ID,因此,它不起作用@grandphuba
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 2017-04-30
  • 2021-07-10
  • 2021-01-20
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
相关资源
最近更新 更多