[Answered ]-Django form is valid() returns false

0👍

I have managed to solve this issue! <br>
Link: https://stackoverflow.com/a/60961015/10732211 <br>

I overhauled the entire thing and followed the above link. Probably the models relations have some issues that does not work. <br>

views.py

class BRHomeView(FormView):
    # model = TargetImage
    template_name = 'br/br-home.html'
    context_object_name = 'bankrecon'

    def get(self, request):
        form = BRFormExtended()
        return render(request, self.template_name, {'form': form, 'title': 'Bank Reconcilation'})

    def post(self, request, *args, **kwargs):
        form = BRFormExtended(request.POST,request.FILES)
        files = request.FILES.getlist('image_files')

        if form.is_valid():
            print("Form Valid")
            print(form.cleaned_data['invoice_date'])
            print(form.cleaned_data['recon_date'])

            user = request.user
            invoice_date = form.cleaned_data['invoice_date']
            recon_date = form.cleaned_data['recon_date']
            target_image_obj = TargetImage.objects.create(user=user,invoice_date=invoice_date, recon_date=recon_date)
            for file in files:
                UploadedImage.objects.create(target_image=target_image_obj,image_files=file)
        else:
            print("Form Invalid")
        return redirect('br-home')

forms.py

class BRForm(forms.ModelForm):
    class Meta:
        model = TargetImage
        fields = ['invoice_date', 'recon_date']
        widgets = {
            'invoice_date': forms.DateInput(attrs={'type': 'date'}),
            'recon_date': forms.DateInput(attrs={'type': 'date'}),
        }

class BRFormExtended(BRForm):
    image_files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}))

    class Meta(BRForm.Meta):
        fields = BRForm.Meta.fields + ['image_files',]

models.py

from django.contrib.auth.models import User
from django.utils import timezone

class TargetImage(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    uploaded_date = models.DateTimeField(default=timezone.now)
    invoice_date = models.DateTimeField()
    recon_date = models.DateTimeField()

    def __str__(self):
        return self.user.__str__()

class UploadedImage(models.Model):
    target_image = models.ForeignKey(TargetImage, on_delete=models.CASCADE)
    image_files = models.ImageField(null=True, blank=True, upload_to='images/')

Also, it would be helpful to have a media root folder and edits to urls.py is also required.

urls.py

from django.urls import path
from .views import BRHomeView
from django.conf import settings
from django.conf.urls.static import static


urlpatterns = [
    path('', BRHomeView.as_view(), name='br-home'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')


STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "static"),)

Hopefully this will help someone!

👤Beelz

1👍

Some errors that I see in your code:

  • You’re trying to render a POST request in your get method.
  • You’re not passing any data from POST request to your form instance. That’s why is_valid() is returning False.

Change your code to something like this and see if it works:

...
    def get(self, request):
        form = BRForm()
        return render(request, self.template_name, {'form': form, 'title': 'Bank Reconcilation'})

    def post(self, request, *args, **kwargs):
        form = BRForm(request.POST)
        if form.is_valid():
            form.save()

        return redirect('br-home')

Leave a comment