user7613100
user7613100

Reputation:

Django ModelForm returns None instead of HttpResponse

I've been following the tutorial for 'File Upload With Model Forms' here: https://simpleisbetterthancomplex.com/tutorial/2016/08/01/how-to-upload-files-with-django.html

I'm pretty sure I followed it to the letter (except using my own project). However I'm getting the error

The view myproject.views.InspectionReportForm_Create didn't return an HttpResponse object. It returned None instead.

Here is my code:

models.py:

class Inspection(models.Model):
InspectionID = models.AutoField(primary_key=True, unique=True)
PartID = models.ForeignKey('Part', on_delete=models.CASCADE, null=True)

@classmethod
def create(cls, partid):
    inspection = cls(PartID = partid)
    return inspection

class InspectionReport(models.Model):
    ReportID = models.AutoField(primary_key=True, unique=True)
    InspectionID = models.ForeignKey('Inspection', on_delete=models.CASCADE, null=True)
    Date = models.DateField(auto_now=False, auto_now_add=False, null=True)
    Comment = models.CharField(max_length=255, blank=True)
    FileName = models.CharField(max_length=255, blank=True)
    Report = models.FileField(upload_to='docs', null=True, blank=True)
    Signature = models.CharField(max_length=255, blank=True)

    @classmethod
    def create(cls, inspid, date, comment, rept, sig):
        inspreport = cls(InspectionID = inspid, Date = date, Comment = comment, Report = rept, Signature = sig)
        return inspreport

forms.py:

class InspectionReportForm(forms.ModelForm):

class Meta:
    model = InspectionReport
    fields = ('InspectionID', 'Date', 'Comment', 'Report', 'Signature')

views.py:

def InspectionReportForm_Create(request):
    if request.method == 'POST':
        form = InspectionReportForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('sites/1')
        else:
            form = InspectionReportForm()
        return render(request, 'moorings/uploadReport.html', {'form': form })

uploadReport.html (just the form. everything else is styling and titles etc):

<div id="wrapper" class="dark">


        <div id="loginwrapper" class="dark">
            <form method="post" enctype="multipart/form-data">
                {% csrf_token %}
                {{ form.as_p }}
                <button type="submit">Create</button>

            </form>

        </div>

</div>

The misfitting div name on the form wrapper is just because I reused the layout from my login page which used a similar form.

EDIT: One thing that might be the issue... the tutorial doesn't say anything about urls.py. So I added this in, which may or may not be correct:

urls.py:

urlpatterns = [
path('', views.index, name='index'),
path('sites/<int:site>', views.sites, name='sites'),
path('parts/<int:part>', views.parts, name='parts'),
path('signup/', views.signup, name = 'signup'),
path('uploadReport/', views.InspectionReportForm_Create, name = 'CreateReport')
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Upvotes: 1

Views: 582

Answers (1)

user12770004
user12770004

Reputation:

Change

def InspectionReportForm_Create(request):
    if request.method == 'POST':
        form = InspectionReportForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('sites/1')
        else:
            form = InspectionReportForm()
        return render(request, 'moorings/uploadReport.html', {'form': form })

to

def InspectionReportForm_Create(request):
    if request.method == 'POST':
        form = InspectionReportForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('sites/1')
    else:
        form = InspectionReportForm()
    return render(request, 'moorings/uploadReport.html', {'form': form })

Upvotes: 2

Related Questions