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
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.MichaelOn 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.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¶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.MichaelOn 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.pyfrom django.contrib import adminfrom django.urls import path, includefrom . import viewsfrom django.conf.urls.static import staticfrom django.conf import settingsurlpatterns = [path('admin/', admin.site.urls),path('home/', views.HomeView.as_view(), name='home_view'),path('', include('pet_profile.urls')),]app urls.pyfrom django.contrib import adminfrom django.urls import pathfrom pet_profile import viewsurlpatterns = [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 viewsfrom django.shortcuts import renderfrom django.views.generic import (ListView,DetailView, FormView)from pet_profile.models import PetOwner, Pet, PetPhoto, PetStoryfrom pet_profile.forms import PhotoUploadFormclass PetOwnerListView(ListView):model = PetOwnercontext_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 = PetOwnercontext_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_datareturn contextclass PetListView(ListView):model = Petcontext_object_name = "pet_list"class PetDetailView(DetailView):model = Petcontext_object_name = "pet"class PetPhotoUploadView(FormView):template_name = "photo_upload.html"form_class = PhotoUploadFormclass PetPhotoListView(ListView):model = PetPhotocontext_object_name = "pet_photo_list"class PetPhotoDetailView(DetailView):model = PetPhotocontext_object_name = "pet_photo"class PetStoryListView(ListView):model = PetStorycontext_object_name = "pet_story_list"class PetStoryDetailView(DetailView):model = PetStorycontext_object_name = "pet_story"view in question is PetPhotoUploadViewThanks 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