МодельФормы не проходит валидацию
Я просто не могу заставить свою модельную форму пройти валидацию. Я вызываю ее из представления, и GET печатает ее правильно, но когда происходит POST, она не подтверждается. Все время получаю
Атрибуты имениValueError Исключение Значение: Представление gestionPartesMedicos.views.partes_medicos_add не вернуло объект объект HttpResponse. Вместо этого оно вернуло None.
form´s соответствуют атрибутам имени модели и формы. Вот моя модель:
class MedicalList(models.Model):
worker= models.ForeignKey(worker, on_delete=models.CASCADE)
description=models.CharField(max_length=255)
upload=models.FileField(upload_to='media/')
created_at=models.DateTimeField(auto_now_add=True)
это мой класс формы:
class MedicalListForm(forms.ModelForm):
class Meta:
model = MedicalList
fields = (
'worker',
'description',
'upload',
)
description=forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control'}))
upload=forms.FileField(widget=forms.ClearableFileInput(attrs={'class': 'form-control'}))
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user_id')
super().__init__(*args, **kwargs)
worker = forms.ModelChoiceField(queryset=None,empty_label=None,widget=forms.Select(attrs={'class': 'form-control'}))
worker_id = Trabajador.objects.filter(user_id=user_id)
self.fields['worker'].queryset = worker_id
self.fields['worker'].empty_label = None
А это мой взгляд в беде:
def medical_list_add(request):
if request.method == "POST":
form = MedicalListForm(request.POST,request.FILES,user_id=request.user)
if form.is_valid():
form.save()
return redirect('medical_list')
else:
form = MedicalListForm(user_id=request.user)
return render(request, 'medical_list_add.html', {'form': form})
Может быть это связано с полем Model created_at? Просто пытаюсь угадать, совсем запутался. заранее спасибо
Основная проблема заключается в том, что ваше представление не возвращает HTTP-ответ в случае, если форма была недействительной. Вы должны разгруппировать вызов render(…)
с помощью:
def medical_list_add(request):
if request.method == "POST":
form = MedicalListForm(request.POST,request.FILES,user_id=request.user)
if form.is_valid():
form.save()
return redirect('medical_list')
else:
form = MedicalListForm(user_id=request.user)
# ↓↓ both for GET and a failed POST
return render(request, 'medical_list_add.html', {'form': form})
Кроме того, поля формы задаются на уровне класса. Конструируя поле формы в методе __init__
, он не будет использовать это поле
class MedicalListForm(forms.ModelForm):
worker = forms.ModelChoiceField(
queryset=Trabajador.objects.none(),
empty_label=None,
widget=forms.Select(attrs={'class': 'form-control'})
)
description=forms.CharField(
widget=forms.Textarea(attrs={'class': 'form-control'})
)
upload=forms.FileField(
widget=forms.ClearableFileInput(attrs={'class': 'form-control'})
)
class Meta:
model = MedicalList
fields = (
'worker',
'description',
'upload',
)
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user_id', None)
super().__init__(*args, **kwargs)
self.fields['worker'].queryset = worker.objects.filter(user_id=user_id)
Вы можете сделать поле необязательным, указав поле модели как NULLable и blank=True
[Django-doc]:
class MedicalList(models.Model):
# …
upload = models.FileField(upload_to='media/', null=True, blank=True)
# …
и затем установите поле upload
в форме required=False
[Django-doc]:
class MedicalListForm(forms.ModelForm):
worker = forms.ModelChoiceField(
queryset=Trabajador.objects.none(),
empty_label=None,
widget=forms.Select(attrs={'class': 'form-control'})
)
description=forms.CharField(
widget=forms.Textarea(attrs={'class': 'form-control'})
)
upload=forms.FileField(
required=False,
widget=forms.ClearableFileInput(attrs={'class': 'form-control'})
)
class Meta:
model = MedicalList
fields = (
'worker',
'description',
'upload',
)
def __init__(self, *args, **kwargs):
user_id = kwargs.pop('user_id', None)
super().__init__(*args, **kwargs)
self.fields['worker'].queryset = worker.objects.filter(user_id=user_id)