Django没有将数据传递给post方法

时间:2018-02-25 01:47:07

标签: django python-3.x django-forms django-templates

我一直在浏览一个Django教程,我遇到过一个问题,每当我试图发布一个表单来将数据从网页传递到数据库时,它就不会转到它应该去的方法为了执行该操作。这是代码

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)

任何指针对于为什么会发生这种情况会有所帮助。我回到教程,然后再次输入其中的内容,以确保我正确地完成了它。可能是因为它是一个稍微旧的版本,我不确定。我正在运行Django 2.0版本,同时教程运行1.9.1

2 个答案:

答案 0 :(得分:1)

问题出在您最喜欢的视图中。您必须使用if语句来捕获POST请求数据。这样的事情。

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)

看看你是否可以在视图中实现这样的结构。如果您有任何疑问或需要更多详细信息,请在下面发表评论。

答案 1 :(得分:0)

希望有所帮助

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",
            })