При использовании виджета FileInput и виджета passwordInput в Django modelform данные не отображаются в шаблоне
Мы используем ModelForm, и среди полей есть поля, использующие виджет FileInput и виджет passwordInput.
На странице редактирования данных, которые уже были сохранены, возникла проблема.
Код выглядит следующим образом.
# forms.py
from django.forms import ModelForm
from django.forms.widgets import TextInput, CheckboxInput, FileInput, PasswordInput,
Select, Textarea
from .models import Testcase
class TestcaseForm(ModelForm):
class Meta:
model = Testcase
fields = ('subject', 'content', 'content_type', 'attached_file', 'attached_file_password', 'request_for_inspection', 'firewall_is_set', 'additional_requests')
widgets = {
'subject': TextInput(attrs={
'id': 'subject',
'name': 'subject',
'class': 'form-control mb-3',
'placeholder': '',
}),
'content': Textarea(attrs={
'id': 'content',
'name': 'content',
'class': 'form-control mb-3',
'draggable': 'false',
'placeholder': '',
}),
'content_type': Select(attrs={
'id': 'content_type',
'name': 'content_type',
'class': 'form-select mb-3',
}),
'attached_file': FileInput(attrs={
'id': 'attached_file',
'name': 'attached_file',
'class': 'form-control mb-3',
}),
'attached_file_password': PasswordInput(attrs={
'id': 'attached_file_password',
'name': 'attached_file_password',
'class': 'form-control mb-3',
'placeholder': '',
}),
'request_for_inspection': Select(attrs={
'id': 'request_for_inspection',
'name': 'request_for_inspection',
'class': 'form-select mb-3',
}),
'firewall_is_set': CheckboxInput(attrs={
'id': 'firewall_is_set',
'name': 'firewall_is_set',
'class': 'form-check-input ',
}),
'additional_requests': Textarea(attrs={
'id': 'additional_requests',
'name': 'additional_requests',
'class': 'form-control mb-3',
'placeholder': '',
}),
}
Это часть файла представления.
# views.py
def TestcaseDetailViewer(request, id):
testcase = get_object_or_404(Testcase, pk=id)
if request.method == 'POST':
form = TestcaseForm(request.POST, request.FILES, instance=testcase)
if form.is_valid():
testcase = form.save(commit=False)
testcase.save()
return redirect('mailingdata:testcase_detail', id=testcase.id)
else:
context = {
'testcase': testcase,
'form': TestcaseForm(instance=testcase)
}
return render(request, 'testcase_detail.html', context)
Шаблон, позволяющий редактировать импортированные данные через значения id, включенные в url.
<!-- detail.html -->
<form method="POST" enctype="multipart/form-data" class="form mb-3">
{% csrf_token %}
<div class="card mb-3">
<div class="card-body">
<div class="fs-3 card-title">
<i class="bi bi-envelope"></i>
Mail content
</div>
<p class="card-text form-label">Subject</p>
{{ form.subject }}
<p class="card-text form-label">Content</p>
{{ form.content }}
<p class="card-text form-label">Content type</p>
{{ form.content_type }}
<p class="card-text form-label">Attached file</p>
{{ form.attached_file }}
<p class="card-text form-label">Attached file password</p>
{{ form.attached_file_password }}
</div>
</div>
Одна странность заключается в том, что когда рассматриваемый виджет удаляется из формы, поле и данные нормально применяются к шаблону.
Буду признателен, если вы подскажете мне ответ.