为什么我的 Django 表单没有将数据发送到数据库?

问题描述 投票:0回答:1

我是 Django 和 Python 的新手。我为我的项目创建了一个博客,但是当尝试使用表单将博客文章添加到数据库时,我无法弄清楚如何使用发送按钮来实际更新数据库中的模型。我设法让它显示在视图中,但发送按钮是问题所在。

这是模型:

class BlogPost(models.Model):
    title = models.CharField(max_length=250)
    content = models.TextField()
    post_author = models.CharField(max_length=30)
    creation_date = models.DateTimeField(auto_now_add=True)
    modification_date = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='blog/files/blog_images')
    categories = models.ManyToManyField('Category', related_name='posts') #Relaciona el atributo con la clase Category y permite usar category.posts

    def __str__(self):
        return self.title
    
    class Meta:
        verbose_name = "blog post"
        verbose_name_plural = "blog posts"

这是表格:

class newPostForm(forms.Form):
    title = forms.CharField(max_length=250)
    content = forms.CharField(
        widget=forms.Textarea()
    )
    image = forms.ImageField()
    post_author = forms.CharField()

这是视图:

def new_post(request):
    if request.method == "POST":
        form = newPostForm(request.POST)
        if form.is_valid():
            
            info = form.cleaned_data()

            new_post_info = BlogPost(
                title=info["title"],
                content=info["content"],
                image=info["image"],
                post_author=info["post_author"],
                )

            new_post_info.save()    

            return render(request, "")
        
    else:
        form = newPostForm()
    
    return render(request, "blog/new_post.html", {"form":form})

我不知道您是否需要更多信息,请告诉我。预先感谢!

django django-models django-views django-forms
1个回答
0
投票

您的表单包含

ImageField
,这意味着它还需要访问
request.FILES

from django.shortcuts import redirect


def new_post(request):
    if request.method == 'POST':
        form = newPostForm(request.POST, request.FILES)
        if form.is_valid():
            info = form.cleaned_data()
            new_post_info = BlogPost(
                title=info['title'],
                content=info['content'],
                image=info['image'],
                post_author=info['post_author'],
            )
            new_post_info.save()
            return redirect('name-of-some-form')
    else:
        form = newPostForm()
    return render(request, 'blog/new_post.html', {'form': form})

并通过在 HTML 表单中指定

enctype=""
对表单数据中的文件进行编码:

<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <!-- … -->
</form>

不过,我强烈建议使用

ModelForm
,它将处理表单并自动保存:

class PostForm(forms.ModelForm):
    class Meta:
        model = BlogPost
        fiels = ['title', 'content', 'image', 'post_author']

然后我们合作:

from django.shortcuts import redirect


def new_post(request):
    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('name-of-some-view')
    else:
        form = PostForm()
    return render(request, 'blog/new_post.html', {'form': form})

注意:如果 POST 请求成功,您应该创建

redirect
 [Django-doc] 实现 Post/Redirect/Get 模式[wiki]。 这可以避免您在用户刷新时发出相同的 POST 请求 浏览器。

© www.soinside.com 2019 - 2024. All rights reserved.