Form Page URL Not Found

60 views
Skip to first unread message

Michael Starr

unread,
Apr 29, 2023, 9:27:33 PM4/29/23
to Django users
This isn't the exact name of the error; I'm sure you all have encountered the bad URL error before. But, it tells me it can't find the pet matching the query (I'm making a pet website), and it checked the urls in the order listed below. I mean, you know, in the order in the urls.py file.

Another url works from the project urls.py file, but this url is in the app urls.py file. But it does check the imported urls.

This url should be routing to a form template which is connected to a form view to update a photo object in my models.

I'm not sure which files would be relevant to share. Here are the ones I'm guessing may help:

project urls.py
from django.contrib import admin
from django.urls import path, include
from . import views
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    path('admin/', admin.site.urls),
    path('home/', views.HomeView.as_view(), name='home_view'),
    path('', include('pet_profile.urls')),
]

app urls.py
from django.contrib import admin
from django.urls import path
from pet_profile import views

urlpatterns = [
    path("pet/<slug:slug>/", views.PetDetailView.as_view(), name = "pet_profile"),
    path("owner/<slug:slug>/", views.PetOwnerDetailView.as_view(), name = "owner_profile"),
    path("pet/photoupload/", views.PetPhotoUploadView.as_view(), name = "photo_upload"),
]
url in question is the bottom one (photo_upload)

template (photo_upload.html)
<!DOCTYPE html>
<html>
    <head>

    </head>
    <body>
        <label>Upload a photo of your pet: <input type="file" /></label>
    </body>
</html>

app views
from django.shortcuts import render
from django.views.generic import (ListView,
                                  DetailView, FormView)
from pet_profile.models import PetOwner, Pet, PetPhoto, PetStory
from pet_profile.forms import PhotoUploadForm

class PetOwnerListView(ListView):
    model = PetOwner
    context_object_name = "owner_list"
    template_name = "home.html"

   
# def all_pet_photos(request):
#     pets = Pet.objects.all()
#     pet_data = {}
#     for pet in pets:
#         pet_data[pet] = PetPhoto.objects.filter(pets=pet)
#     context = {'pet_data': pet_data}
#     return render(request, 'pet_owner_profile.html', context)

class PetOwnerDetailView(DetailView):
    model = PetOwner
    context_object_name = "owner"
    template_name = "pet_owner_profile.html"
    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(**kwargs)
        pets = Pet.objects.all()
        pet_data = {}
        for pet in pets:
            pet_data[pet] = PetPhoto.objects.filter(pets=pet)
        context['pet_data'] = pet_data
        return context

class PetListView(ListView):
    model = Pet
    context_object_name = "pet_list"

class PetDetailView(DetailView):
    model = Pet
    context_object_name = "pet"

class PetPhotoUploadView(FormView):
    template_name = "photo_upload.html"
    form_class = PhotoUploadForm

class PetPhotoListView(ListView):
    model = PetPhoto
    context_object_name = "pet_photo_list"

class PetPhotoDetailView(DetailView):
    model = PetPhoto
    context_object_name = "pet_photo"

class PetStoryListView(ListView):
    model = PetStory
    context_object_name = "pet_story_list"

class PetStoryDetailView(DetailView):
    model = PetStory
    context_object_name = "pet_story"

view in question is PetPhotoUploadView

Thanks in advance.
Michael

Michael Starr

unread,
Apr 29, 2023, 10:19:30 PM4/29/23
to Django users
To contribute to my own answer, but not to answer the question:
I forgot that Django can automatically render HTML forms using the tagging language.

The template

We don’t need to do much in our name.html template:

<form action="/your-name/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit"> </form>

All the form’s fields and their attributes will be unpacked into HTML markup from that {{ form }} by Django’s template language.

I will use this to update my template context. But I don't think this is the cause of the url routing error.
Michael

ALBERT ASHABA AHEEBWA

unread,
Apr 30, 2023, 3:27:00 AM4/30/23
to django...@googlegroups.com
Hi there,
Yes you need to add {{form}} to your html. I didn't see your models.py file, but let's assume that's okay too.

If you are going to use cbv(class based views), The upload view should inherit from the CreateView. Try this amazing resource to learn more,


And also don't forget to add the form attr enctype='multipart/form-data' since it's a file upload field. 



Best Regards,

Albert Ashaba Aheebwa
+256 781 435857

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/6c5ead2a-764e-4fa8-a903-a86ae5def321n%40googlegroups.com.

Michael Starr

unread,
Apr 30, 2023, 4:43:02 PM4/30/23
to Django users
Hi Alberta. Thank you for the wonderful resource. I like concise information displays.

Can you explain, by any chance, when a FormView and when a CreateView are used? The tutorials also say use CreateView, but I went for what was more logical to me--and it didn't work. But that may not have been the reason it didn't work. The docstring for the CreateView is a little ambiguous. To put it here, " View for creating a new object, with a response rendered by a template." What do they mean by new object? Whereas for FormView, it is clear: " A view for displaying a form and rendering a template response." This seems more appropriate.

The {{ form }} is polish on the nail. I need my URL to be found first.

But thank you for the tangential improvements.

Michael

Michael Starr

unread,
May 1, 2023, 7:20:58 PM5/1/23
to Django users
I made some progress on the error.
It's a view error. It's thrown by PetDetailView (which isn't even being called with this url call or this template), and it can't find the context object name that I defined as pet, which is stupid, because I defined it, it's not a memory lookup.
QED Django is bad.

Mike

Dylan Reinhold

unread,
May 1, 2023, 7:26:04 PM5/1/23
to django...@googlegroups.com
Ill bite.

urlpatterns = [
    path("pet/<slug:slug>/", views.PetDetailView.as_view(), name = "pet_profile"),
    path("owner/<slug:slug>/", views.PetOwnerDetailView.as_view(), name = "owner_profile"),
    path("pet/photoupload/", views.PetPhotoUploadView.as_view(), name = "photo_upload"),
]

You if you are going to url /pet/photoupload/ that is going to call the first one and process "photoupload" as the slug.
Move the photoupload above the the wildcard <slug> entry.

Dylan

Michael Starr

unread,
May 1, 2023, 7:32:51 PM5/1/23
to Django users
Man that one always gets me. I forget, often, that computers are simple automatons that obey logical rules.

Thank you, good sir.

Michael

ALBERT ASHABA AHEEBWA

unread,
May 1, 2023, 7:42:45 PM5/1/23
to django...@googlegroups.com

Hi Michael,

On the issue, of urls, Django uses some kind of regex expression to know which view to render. And because it's python, it reads from top - bottom. So the two urls "pet/..." are colliding. Change one url to confirm the suspicions.

On your query of when to Use FormView or CreateView, if you need to save data to the database, always use CreateView. But if all you need is capture data and do something with it, like send an email, then FormView is for you.. Or a normal FBV can work too 


Best Regards,

Albert

ALBERT ASHABA AHEEBWA

unread,
May 1, 2023, 7:44:39 PM5/1/23
to django...@googlegroups.com
Oh, just realized Dylan had already answered url bit 




Best Regards,

Albert Ashaba Aheebwa
+256 781 435857

Michael Starr

unread,
May 1, 2023, 8:08:33 PM5/1/23
to Django users
Thanks, Albert!
Mike
Reply all
Reply to author
Forward
0 new messages