МодельФормы не проходит валидацию

Я просто не могу заставить свою модельную форму пройти валидацию. Я вызываю ее из представления, и 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)
Вернуться на верх