get_absolute_url function not working? - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: Web Scraping & Web Development (https://python-forum.io/forum-13.html) +--- Thread: get_absolute_url function not working? (/thread-28260.html) |
get_absolute_url function not working? - mp3909 - Jul-11-2020 Hi, So I am using django 2.2.7 and following videos on youtube for learning Python Django. My models.py file consists of a class for an Album object and a class for a Song object. Inside this models.py file I have declared a function called get_absolute_url (please see the attached image models). I want to allow the user of the website to be able to create a new Album object by filling in a form and then clicking submit. Therefore, I have created this form - its consists of two separate codes shown in album_form.jpg and form-template.jpg. They just enter values for for input fields album, artist, genre and logo. Then they click submit. I have attached an image of what the actual forum looks like on the web. However, the issue I am having is that clicking submit does not seem to do anything at all. The least I was expecting was to be redirected to the url written inside the get_absolute_url function which is "music:detail" passing in the primary key that gets created when new object of Album is made. The "music:detail" is the name for the url and it is path('<int:pk>/', views.DetailView.as_view(), name='detail') Does anyone know why this is happening? Some people have mentioned changing the action in form code but the tutorials I am following leave the action as blank i.e. action="" so that's why I left it as blank. Not sure if that is the issue? Thanks, RE: get_absolute_url function not working? - mp3909 - Jul-12-2020 I change my code to incorporate crispy_forms. Anyways, this is what my final code looks like so far: models.py: from django.db import models from django.urls import reverse # Create your models here. class Album(models.Model): artist = models.CharField(max_length=250) album_name = models.CharField(max_length=500) genre = models.CharField(max_length=100) album_logo = models.ImageField() def get_absolute_url(self): return reverse('music:detail', kwargs={'pk':self.pk}) def __str__(self): return self.album_name + " - " + self.artist class Song(models.Model): album = models.ForeignKey(Album, on_delete=models.CASCADE) file_type = models.CharField(max_length=100) song_title = models.CharField(max_length=250) is_favourite = models.BooleanField(default=False) def __str__(self): return self.song_titleviews.py: from django.views import generic from .models import Album, Song # Create your views here. class IndexView(generic.ListView): template_name = 'music/index.html' queryset = Album.objects.all() context_object_name = 'all_albums' class DetailView(generic.DetailView): model = Album template_name = 'music/detail.html' class AlbumCreate(generic.CreateView): model = Album fields = ['artist', 'album_name', 'genre', 'album_logo'] def form_valid(self, form): return super().form_valid(form)album_form.html: {% extends 'music/base.html' %} {% load crispy_forms_tags %} {% block title %}Add a New Album{% endblock %} {% block body %} <form method="post"> {% csrf_token %} {{ form|crispy }} <input type="submit" value="Add"> </form> {% endblock %}The issue I am having now is that when I fill in the form and upload a .jpg image in the album_logo field, after clicking the Add button, it gives me an error saying no file was uploaded for the album_logo field, this field is required. I don't know why it is complaining as this is not true, I did upload an image from my desktop into this field. This is the form: [attachment=934] RE: get_absolute_url function not working? - mp3909 - Jul-12-2020 i found the solution to my own problem. i had to add enctype="multipart/form-data" in my form. RE: get_absolute_url function not working? - mp3909 - Jul-15-2020 Actually, since changing my form to the below, it now no longer works even though I have enctype="multipart/form-data" {% extends 'music/base.html' %} {% block title %}Add a New Album{% endblock %} {% block body %} <form class="formContainer" method="post" enctype="multipart/form-data"> {% csrf_token %} {% for field in form %} {% if field.label != 'Album logo' %} <label for="field{{ forloop.counter }}">{{ field.label }}</label> <input type="text" id="field{{ forloop.counter }}" name="" value=""> {% else %} <label for="field{{ forloop.counter }}">{{ field.label }}</label> <input type="file" id="field{{ forloop.counter }}" name="" value="" accept="image/*"> {% endif %} <br> {% endfor %} <input type="submit" id="submitBtn" name="" value="Add"> </form> {% endblock %}Upon clicking the submit button in the form, it should take me to the details page for the Album that got created. Does anyone have any idea please? |