尝试使输入文件不是必需的,但在 Django Python 中仍然是必需的

问题描述 投票:0回答:2

嗨,我仍在学习 django 和 python,我制作了上传文件的功能,但我希望该文件不是必需的。

这是我的代码:

模型.py

class Ticket(models.Model):
   status = models.CharField(max_length=20, default="Pending")
   created = models.DateTimeField(auto_now_add=True)
   updated = models.DateTimeField(auto_now=True)
   docfile = models.FileField(upload_to='attachments/file/%Y/%m/%d/%P', blank=True, null=True)

views.py

def new_ticket(request):

form = TicketForm()
if request.method == 'POST':
    
    form = TicketForm(request.POST, request.FILES)
    if form.is_valid() :
        form = form.save(commit=False)
        form.owner = request.user
        form.save()

        if form.docfile == 'docfile' :
            newdoc = TicketForm(docfile=request.FILES['docfile'])
            newdoc.save()

        return redirect('helpdesk:dashboard')
documents = Ticket.objects.all()
return render(request, 'helpdesk/new_ticket.html', {'form':form,'documents':documents})  

表格.py

class TicketForm(forms.ModelForm):
   status = forms.CharField(required=True)
   docfile = forms.FileField(required=False)
   class Meta:
       model = Ticket
       fields = ('status', 'docfile')

new_ticket.html

<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group">
    <label for="status">Status</label>
    {% render_field form.status class="form-control"%}
</div>
<div class="form-group">
    <label for="docfile">File Upload: </label>
    {% render_field form.docfile required=false class="form-control"  %}
    
</div>
<hr>
<input class="form-group button_main btn-lg" type="submit" value="Send" style="border: 0px;"></form>

我已经尝试了此链接中的一些解决方案:

Django ModelChoice 字段设置为 required=False,但在浏览器中仍然是必需的

Django 使 ContentType 不需要

Django 表单总是显示错误“此字段为必填字段”

Django TextField 始终是必需的,尽管空白=True,Null=True

Django - 表单模板为 Imagefield 抛出“此字段为必填”

但是输入字段仍然是必需的,我也尝试从 javascript 和 jquery 中将其设置为 false,但它仍然是必需的。我尝试不渲染它,只是将其添加到原始 html 中,但它仍然是必需的。

Image from console.log

提前谢谢你

django django-models django-views django-forms django-templates
2个回答
0
投票

您尝试过以下选项吗:

#forms.py

from django.forms import TextInput, ClearableFileInput

class TicketForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['docfile'].required = False

    class Meta:
        model = Ticket
        fields = ('status', 'docfile')

        widgets = {
            'status': TextInput(attrs={'class': 'form-control',},),
            'docfile':ClearableFileInput(attrs={'class': 'form-control',},),
        }

#new_ticket.html

<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.status.label }}
    {{ form.status}
    {{ form.docfile.label}}
    {{ form.docfile}}
   <input type="submit" value="Submit">
</form>

注意:这里我在 forms.py 中使用 Bootsrap CSS 类进行样式设置,您也可以使用自定义 CSS 类。


0
投票

就我而言,我有类似的情况:

class UpdateProfileForm(ModelForm):
    avatar_image = ImageField(widget=FileInput)

    class Meta:
        model = Profile
        fields = ["avatar_image", "bio", "location", "birth_date", "zip_code"]

当我更改为:

avatar_image = ImageField(widget=FileInput, required=False)

看起来当使用带有小部件 FileInput 的定义表单字段时,默认情况下必需设置为 True (尽管我在模型中将其设置为 null=True、blank=True ,甚至从手动文件输入元素中删除了“required”在 html 中——很奇怪——但我猜就是这样)。

© www.soinside.com 2019 - 2024. All rights reserved.