首页 > 解决方案 > Django作者表单未保存到数据库

问题描述

模型.py

    class Blog(models.Model):
       title = models.CharField(max_length=100, unique=True)
       slug = models.CharField(max_length=100, unique=True)
       post_pic = models.ImageField(upload_to ='media/post_pics/', default =None )
       body = models.TextField()
       posted = models.DateTimeField(db_index=True, auto_now_add=True)
       #author = must be logged in, populate from login details

表格.py

    class postForm(forms.Form):
       title = forms.CharField(max_length=100)
       slug = forms.CharField(max_length=100)
       post_pic = forms.ImageField()
       body = forms.CharField(widget=SummernoteWidget())

视图.py

    def write_detail(request):
        template_name = 'blog/write.html'
        
        if request.method == 'POST':

            post_form = postForm(request.POST)
            
            if post_form.is_valid():
                new_post = Blog(title=title,slug=slug,post_pic=post_pic,body=body)
                new_post.save()
                return HttpResponseRedirect(blog.get_absolute_url()) 

        else:
            post_form = postForm()
     
        return render(request, template_name, {'post_form': post_form}) 

写.html


    {% extends 'blog/base.html' %}
    {% load static %}
    {% block back-img %}'{% static 'blog/assets/img/intro.jpg' %}'{% endblock back-img %}
     {% block titdes %}Write{% endblock titdes %}
     {% block title %}Write{% endblock title %}
     {% block pagedes %}A django powered community blog{% endblock pagedes %}
    {% block body%}

    <form method = "POST">
    {{ post_form.as_p }}
    {% csrf_token %}
    <button type="submit" class="btn btn-primary">Publish</button>
    </form>
    {% endblock %}

我已经设置了这个表单,以便作者可以在不访问管理面板的情况下将文章写入博客,我相信它应该可以工作,但它不会保存到数据库中。

我试图一遍又一遍地处理这些观点,但不知道还能做什么。请不要删除我的问题,只要问任何可以帮助你的问题。

标签: python-3.xdjango

解决方案


看起来您只需要保存表单,但您正在创建一个新Blog对象,其中包含我们在任何地方都看不到定义的值。

new_post = Blog(title=title,slug=slug,post_pic=post_pic,body=body)

title, slug, 等没有得到定义。

您应该做的是将其更改为 aModelForm以便 django 完成所有艰苦的工作;

class postForm(forms.ModelForm):

    class Meta:
        model = Blog
        fields = ('title', 'slug', 'post_pic', 'body')
        widgets = {
            'body': SummernoteWidget(),
        }

那么在您看来,您只需要这样做;

    def write_detail(request):
        template_name = 'blog/write.html'
        
        if request.method == 'POST':

            post_form = postForm(request.POST)
            
            if post_form.is_valid():
                post_form.save()
                return HttpResponseRedirect(blog.get_absolute_url()) 
        else:
            # GET request
            post_form = postForm()
     
        return render(request, template_name, {'post_form': post_form}) 

表格(和模型表格)的summernote文档在这里

不要忘记,当使用媒体附带的这样的小部件时,您需要将表单的媒体添加到模板中。

您可以在 HTML 中使用{{ form.media }}获取所有 CSS 和 JS 或单独{{ form.media.js }}访问它{{ form.media.css }}

你可以在summernote应用游乐场看到他们是如何做到的


推荐阅读