Django DateField persistence
У меня есть модель / форма / представление для запроса, который работает хорошо, но когда я хочу обновить запрос, все поля загружаются, кроме поля due_date (с виджетом даты), которое остается пустым. Если я не обращаю внимания, то происходит валидация и due_date становится None. Я бы хотел, чтобы по умолчанию загружалась дата, которая была сохранена при создании, а потом я мог ее изменить или нет. Вот код.
Модель
class Request(models.Model):
thematic = models.ForeignKey(
Thematic,
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name="Thématique",
)
context = models.ForeignKey(
Context,
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name="Contexte",
)
technical_element = models.CharField(
max_length=255, verbose_name="Élément technique", blank=True, null=True
)
due_date = models.DateField(verbose_name="Date d'échéance", blank=True, null=True)
def __str__(self):
return self.context
class Meta:
verbose_name = "Request"
verbose_name_plural = "Requests"
Формы
class RequestForm(forms.ModelForm):
new_thematic = forms.CharField(
max_length=255, required=False, label="New Thematic"
)
new_context = forms.CharField(
max_length=255, required=False, label="New Context"
)
due_date = forms.DateField(
widget=forms.DateInput(attrs={"type": "date"}),
required=False,
)
class Meta:
model = Demande
fields = "__all__"
widgets = {
"thematic": forms.Select(attrs={"class": "form-control"}),
"context": forms.Select(attrs={"class": "form-control"}),
"technical_element": forms.TextInput(attrs={"class": "form-control"}),
"due_date": forms.DateInput(
attrs={"class": "form-control", "type": "date"}
),
}
def __init__(self, *args, **kwargs):
super(DemandeForm, self).__init__(*args, **kwargs)
if "instance" in kwargs:
instance = kwargs["instance"]
if instance.due_date:
self.fields["due_date"].initial = instance.due_date
self.fields["thematic"].queryset = Thematic.objects.all()
self.fields["context"].queryset = Context.objects.all()
def save(self, commit=True):
instance = super(DemandeForm, self).save(commit=False)
new_thematic_name = self.cleaned_data.get("new_thematic")
new_context_description = self.cleaned_data.get("new_context")
if new_thematic_name:
thematic, created = Thematic.objects.get_or_create(name=new_thematic_name)
instance.thematic = thematic
if new_context_description:
context, created = Context.objects.get_or_create(
description=new_context_description
)
instance.context = context
if commit:
instance.save()
return instance
Виды
class UpdateRequestView(View):
def get(self, request, pk):
request_instance = get_object_or_404(Request, pk=pk)
request_form = RequestForm(instance=request_instance)
return render(
request,
"operation/update_request_form.html",
{
"request_form": demande_form,
"request_instance": request_instance,
"title": f"Modify the request {request_instance.context}",
},
)
def post(self, request, pk):
request_instance = get_object_or_404(Request, pk=pk)
request_form = RequestForm(request.POST, instance=request_instance)
if request_form.is_valid():
instance = request_form.save(commit=False)
due_date = request_form.cleaned_data.get("due_date")
if due_date:
instance.due_date = due_date
instance.save()
messages.success(request, "The request was successfully updated.")
return redirect(reverse("drequest_detail", args=[instance.id]))
else:
for field, errors in request_form.errors.items():
for error in errors:
messages.error(request, f"Error {field}: {error}")
return render(
request,
"operation/update_request_form.html",
{
"request_form": demande_form,
"request_instance": request_instance,
"title": f"Modify the request {request_instance.context}",
},
)
В части POST я уже пробовал вывести значение due_date, но это не работает.
Я попробовал инит в части формы и другое решение в части представления post.