django crispy表单文件上载

django crispy表单文件上载,django,django-forms,django-crispy-forms,Django,Django Forms,Django Crispy Forms,我无法使用django crispy表单正确上传图像字段。表单和页面上的所有其他内容都可以正常工作,但图像字段不会出错或保存,它只是直接经过它。我可以通过管理员添加图像只是罚款,它只在我的脆形式失败 #views.py @login_required def dashboard(request, **kwargs): ''' perform managerial and administrative tasks for a blog. Only available to

我无法使用django crispy表单正确上传图像字段。表单和页面上的所有其他内容都可以正常工作,但图像字段不会出错或保存,它只是直接经过它。我可以通过管理员添加图像只是罚款,它只在我的脆形式失败

#views.py
@login_required
def dashboard(request, **kwargs):
    '''
    perform managerial and administrative tasks for a blog. Only
    available to the blog owner
    '''
    alert_message = ""
    status = ""

    blog_slug = kwargs['blog']
    blog = get_object_or_404(PersonalBlog, slug=blog_slug)

    # handle the form submit to update blog data
    form = BlogEditForm(instance=blog)
    if request.method == "POST":
        if blog.owner == request.user:
            form = BlogEditForm(request.POST, instance=blog)

            if form.is_valid():
                form.save()

                alert_message = "Your blog data has been updated successfully"
                status = "saved"
            else:
                alert_message = "There was a problem saving the data you entered. Please correct the errors above."
                status = "error"
        else:
            alert_message = "You do not have access to update this blog's information."
            status = "error"


    return render(request, "blogcontent/dashboard.html", {'alert_message':alert_message,
                                                          'status':status, 'form':form})


#forms.py
class BlogEditForm(ModelForm):
    description = forms.CharField(widget = forms.Textarea())
    twitter = forms.CharField(required=False, help_text="show twitter feed, and allow people to interact with you on twitter")
    twitter_widget_id = forms.CharField(required=False, help_text="required to show a timeline widget for your twitter account. " + \
                                                  "<span class='glyphicon glyphicon-question-sign'></span>")
    instagram = forms.CharField(required=False, help_text="show instagram feed on your blog page")
    disqus = forms.CharField(required=False, help_text="allow comments at the bottom of your blog posts")

    class Meta:
        model = PersonalBlog

    def __init__(self, *args, **kwargs):
        super(BlogEditForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            Fieldset(
                '<h2 class="text-center">Edit data about your blog</h2>',
                Field('owner', type="hidden"),
                Field('title', type="hidden"),
                Div('description', css_class="col-md-12"),
                Div('twitter', css_class="col-md-6"),
                Div('twitter_widget_id', css_class="col-md-6"),
                Div('instagram', css_class="col-md-6"),
                Div('disqus', css_class="col-md-6"),
                Div('logo', css_class="col-md-12"),
            ),
            ButtonHolder(
                Submit('submit', 'Update Info', css_class='btn-lg'),
                css_class="text-center"
            ),

        )

#dashboard.html
<form method="post" enctype="multipart/form-data">
                        {% crispy form %}
                    </form>
#views.py
@需要登录
def仪表板(请求,**kwargs):
'''
为博客执行管理和管理任务。只有
可供博客所有者使用
'''
alert_message=“”
status=“”
blog_slug=kwargs['blog']
blog=获取对象或404(PersonalBlog,slug=blog\u slug)
#处理表单提交以更新博客数据
form=BlogEditForm(实例=blog)
如果request.method==“POST”:
如果blog.owner==request.user:
form=BlogEditForm(request.POST,instance=blog)
如果form.is_有效():
form.save()
alert\u message=“您的博客数据已成功更新”
status=“已保存”
其他:
alert\u message=“保存您输入的数据时出现问题。请更正上述错误。”
status=“error”
其他:
alert_message=“您无权更新此博客的信息。”
status=“error”
返回呈现(请求“blogcontent/dashboard.html”,{'alert_message':alert_message,
“状态”:状态,“形式”:形式})
#forms.py
类BlogEditForm(ModelForm):
description=forms.CharField(widget=forms.Textarea())
twitter=forms.CharField(required=False,help_text=“显示twitter提要,并允许人们在twitter上与您互动”)
twitter\u widget\u id=forms.CharField(required=False,help\u text=“为您的twitter帐户显示时间轴widget所需。”+\
"")
instagram=forms.CharField(必填项=False,help_text=“在您的博客页面上显示instagram提要”)
disqs=forms.CharField(必需=False,help_text=“允许在博客文章底部发表评论”)
类元:
model=个人博客
定义初始化(self,*args,**kwargs):
超级(BlogEditForm,self)。\uuuuuu初始值(*args,**kwargs)
self.helper=FormHelper()
self.helper.layout=布局(
字段集(
“编辑有关您博客的数据”,
字段('owner',type=“hidden”),
字段('title',type=“hidden”),
Div('description',css_class=“col-md-12”),
Div('twitter',css_class=“col-md-6”),
Div('twitter\u widget\u id',css\u class=“col-md-6”),
Div('instagram',css_class=“col-md-6”),
部门('dischs',css_class=“col-md-6”),
部门('logo',css_class=“col-md-12”),
),
钮扣工(
提交(“提交”,“更新信息”,css_class='btn-lg'),
css_class=“文本中心”
),
)
#dashboard.html
{%crispy form%}

您是否尝试过更改:

<form method="post" enctype="multipart/form-data">
    {% crispy form %}
</form>
在您的代码中,您正在调用:

if form.is_valid():
    form.save()

您不想
保存()
表单。您希望将表单数据保存到模型实例。因此
create()
使用表单数据创建一个模型。这也可能是原因<代码>表单只是用来保存数据,直到您清理数据并使用
模型将其保存到数据库中

啊,我就知道这会很愚蠢。我没有将request.FILES附加到form.save()对象


我刚刚试着去掉表单标签,结果是一样的,生成的HTML也是一样的。这个例子实际上只是修改一个实例,在创建模型实例时有不同的逻辑(这个问题上没有),它的行为方式与logo字段相同。
if form.is_valid():
    form.save()
form = BlogEditForm(request.POST, request.FILES, instance=blog)