繁体   English   中英

Python Django 表单提交按钮无法按预期工作

[英]Python Django Form submit button not working as desired

我一直在努力学习 Django。 我被困在这个表格部分。 已经创建了一个表单,允许用户创建专辑 object,他们可以在其中填写艺术家、专辑名称、流派并上传专辑徽标。 当我填写字段然后单击提交时,它应该会将我重定向到刚刚创建的特定专辑的详细信息页面。 但是单击提交按钮时似乎没有任何反应,并且没有创建 object。

这是包含 4 个字段的专辑 class 的 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_title

这是album_form.html 代码,其中包含实际表单。 虽然我知道 CSS,但我对 Bootstrap 并不熟悉,因此我没有使用过 crispy_forms。

{% 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 %}

这是 views.py 代码,其中我使用了基于 class 的视图,而不是基于 function 的视图。

from django.views 导入通用 from.models 导入专辑、歌曲

# 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)

最后这是我的 urls.py 代码:

from django.urls import path, include
from . import views

app_name='music'

urlpatterns = [
    #/music/
    path('', views.IndexView.as_view(), name='index'),

    #/music/5/
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),

    #/music/album/add/
    path('album/add/', views.AlbumCreate.as_view(), name='album-add')
]

单击表单中的提交按钮后,它应该带我到“详细信息” url 以获取创建的专辑的主键。 我在这里错过了什么吗?

在您的 views.py 中,您需要覆盖 CreateView 中的 get_success_url function 并在重定向时将 id 作为参数传递。

class AlbumCreate(generic.CreateView):
    model = Album
    fields = ['artist', 'album_name', 'genre', 'album_logo']

    def form_valid(self, form):
        return super().form_valid(form)

    def get_success_url(self):
        return reverse('music:detail', args=(self.object.id,))

似乎您忘记对<form>标记执行action

尝试这个

<form class="formContainer" action='{% url 'music:album-add'%}' method="post" enctype="multipart/form-data">

编辑:还在AlbumCreate视图中使用get_success_url function 添加成功 url 以将用户重定向到专辑详细信息页面,就像上面的答案中提到的那样

from django.urls import reverse_lazy
...
class AlbumCreate(generic.CreateView):
    ...
    def get_success_url(self, **kwargs):
        return reverse_lazy('music:detail', args = (self.object.id,))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM