Reputation: 55
I have been going over a Django tutorial and I have come across an issue where whenever I am trying to post a form to pass data from the webpage to the database it will not go to the method that it is supposed to go to in order for the action to be performed. Here is the code
urls.py
from django.urls import path, re_path
from . import views
app_name = 'music'
urlpatterns = [
path('', views.index, name='index'),
# /music/<album_id>/
re_path('(?P<album_id>[0-9]+)/', views.detail, name='detail'),
# /music/<album_id>/favorite/
re_path('(?P<album_id>[0-9]+)/favorite/', views.favorite, name='favorite'),
]
details.html
<img src="{{ album.album_logo }}"/>
<h1>{{ album.album_title }}</h1>
<h3>{{ album.artist }}</h3>
{% if error_message %}
<p><strong>{{ error_message }}</strong></p>
{% endif %}
<form action="{% url 'music:favorite' album.id %}" method="post">
{% csrf_token %}
{% for song in album.song_set.all %}
<input type="radio" id="song{{ forloop.counter }}" name="song" value="song.id"/>
<label for="song{{ forloop.counter }}">
{{ song.song_title }}
{% if song.is_favorite %}
<img src="https://i.imgur.com/b9b13Rd.png"/>
{% endif %}
</label><br>
{% endfor %}
<input type="submit" value="Favorite">
</form>
views.py
from django.shortcuts import render, get_object_or_404
from django.http import Http404
from .models import Album, Song
import pdb;
def index(request):
all_albums = Album.objects.all()
return render(request, 'music/index.html', { 'all_albums': all_albums })
def detail(request, album_id):
album = get_object_or_404(Album, pk=album_id)
return render(request, 'music/detail.html', {'album': album})
def favorite(request, album_id):
album = get_object_or_404(Album, pk=album_id)
try:
selected_song = album.song_set.get(pk=request.POST['song'])
except (KeyError, Song.DoesNotExist):
return render(request, 'music/detail.html', {
'album': album,
'error_message': "You did not select a valid song",
})
selected_song.is_favorite = True
selected_song.save()
return redirect('music:detail', album_id=album_id)
Any pointers would be helpful as to why this is occurring. I went back to the tutorial and I typed whatever was in it again to make sure I did it correctly. It could be because it was a slightly older version I am not sure though. I am running Django version 2.0 while the tutorial was running 1.9.1
Upvotes: 0
Views: 1043
Reputation: 2188
Hope it helps
def favorite(request, album_id):
if request.method == "POST":
album = get_object_or_404(Album, pk=album_id)
try:
selected_song = album.song_set.get(pk=request.POST['song'])
selected_song.is_favorite = True
selected_song.save()
return redirect('music:detail', album_id=album_id)
except (KeyError, Song.DoesNotExist):
return render(request, 'music/detail.html', {
'album': album,
'error_message': "You did not select a valid song",
})
Upvotes: 0
Reputation: 5800
The problem is in your favorite view. You have to use an if statement to capture the POST request data. Something like this.
def favorite(request):
if request.method == "POST":
# do whatever you want with your POST data
else:
# do something else
context = {
data: any data that you want to pass to your template
}
return render(request, "your_template.html", context)
See if you can implement a structure like this in your view. If you have any questions or need more details, ask below in comment.
Upvotes: 1