嗨,我仍在学习 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 TextField 始终是必需的,尽管空白=True,Null=True
Django - 表单模板为 Imagefield 抛出“此字段为必填”
但是输入字段仍然是必需的,我也尝试从 javascript 和 jquery 中将其设置为 false,但它仍然是必需的。我尝试不渲染它,只是将其添加到原始 html 中,但它仍然是必需的。
提前谢谢你
您尝试过以下选项吗:
#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 类。
就我而言,我有类似的情况:
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 中——很奇怪——但我猜就是这样)。