【问题标题】:Django not passing data to the post methodDjango没有将数据传递给post方法
【发布时间】:2018-08-04 18:51:50
【问题描述】:

我一直在阅读 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

【问题讨论】:

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


    【解决方案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)
    

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

    【讨论】:

      【解决方案2】:

      希望对你有帮助

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

      【讨论】:

      • 在调试时意识到 post 方法是进入 detail 方法,而不是最喜欢的方法。当我告诉它转到表单中最喜欢的方法时发生这种情况的任何原因。
      • 只看你的代码,你把你的函数帖子重定向到详情页,返回redirect('music:detail',album_id=album_id),把它改成收藏夹
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多