Monday, May 1, 2023

Re: Form Page URL Not Found


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.coding@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,


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

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.

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.

--
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+unsubscribe@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.

--
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+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAAQecPfXVgU8JmcwGQLuWGyVHkh9v9z91AUv3Yy-vtdAaF7Seg%40mail.gmail.com.

No comments:

Post a Comment