Anirudh Upadhyayula
Anirudh Upadhyayula

Reputation: 55

Django not passing data to the post method

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

Answers (2)

Thomas John
Thomas John

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

MiniGunnR
MiniGunnR

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

Related Questions