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 On Tue, 2 May 2023, 02:21 Michael Starr, <michaelstarr.cod...@gmail.com> wrote: > 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 > > On Sunday, April 30, 2023 at 1:43:02 PM UTC-7 Michael Starr wrote: > >> 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 >> >> On Sunday, April 30, 2023 at 12:27:00 AM UTC-7 ALBERT ASHABA AHEEBWA >> wrote: >> >>> 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, >>> >>> https://ccbv.co.uk/ >>> >>> 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 <+256%20781%20435857> >>> >>> On Sun, 30 Apr 2023, 05:20 Michael Starr, <michaelst...@gmail.com> >>> wrote: >>> >>>> 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. >>>> >>>> From the Django Docs >>>> https://docs.djangoproject.com/en/4.1/topics/forms/() >>>> *The template¶ >>>> <https://docs.djangoproject.com/en/4.1/topics/forms/#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 >>>> On Saturday, April 29, 2023 at 6:27:33 PM UTC-7 Michael Starr wrote: >>>> >>>>> 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 >>>>> >>>>> -- >>>> 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 >>>> <https://groups.google.com/d/msgid/django-users/6c5ead2a-764e-4fa8-a903-a86ae5def321n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- > 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+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/e21cf3b4-2b42-4f29-a875-c3e5eda4214bn%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/e21cf3b4-2b42-4f29-a875-c3e5eda4214bn%40googlegroups.com?utm_medium=email&utm_source=footer> > . > -- 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+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAAQecPfXVgU8JmcwGQLuWGyVHkh9v9z91AUv3Yy-vtdAaF7Seg%40mail.gmail.com.