表格未注册照片Django 3.0

表格未注册照片Django 3.0,django,django-forms,django-views,Django,Django Forms,Django Views,我正试图上传一张照片,但表单没有看到文件和表单中的内容。错误,它显示“此字段为必填字段”。我尝试过使用picture=request.FILES['picture']但没有效果,也尝试过picture=form.FILES['picture']以及picture=request.POST.FILES['picture']和picture=form.cleaned\u data.get('picture')我缺少什么?如果您需要更多信息,请告诉我 模板 {% block content %} &l

我正试图上传一张照片,但表单没有看到文件和表单中的内容。错误,它显示“此字段为必填字段”。我尝试过使用
picture=request.FILES['picture']
但没有效果,也尝试过
picture=form.FILES['picture']
以及
picture=request.POST.FILES['picture']
picture=form.cleaned\u data.get('picture')
我缺少什么?如果您需要更多信息,请告诉我

模板

{% block content %}
<h1>Create {{post_type.title}} Post</h1>
<form method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{form.as_p}}
    <button type='submit'>Submit</button>
</form>
{% endblock %}

views.py

@login_required()
def picture_post(request):
    """
    Creates new picture post
    """
    if request.method == "POST":
        form = PicturePostForm(request.POST)
        print("is post")
        if form.is_valid():
            print("is valid") # this never gets printed because of the 'this field is required' error
            author = request.user
            content = form.cleaned_data['description']
            category = form.cleaned_data['categories']
            picture = form.cleaned_data['picture']
            privacy = form.cleaned_data['privacy']

            p_post = PicturePost(author=author, description=content, categories=category, picture=picture,privacy=privacy )
            p_post.save()
            #redirect to last page
            return redirect('home')
        else:
            l = []
            for i in form.errors.keys():
                l.append(form.errors[i])
            return HttpResponse(l)
    else:
        post_type = 'picture'
        form = PicturePostForm()
        return render(request, 'create_post.html', {'form': form, 'post_type': post_type})
相应的模型字段

    picture = models.ImageField(upload_to=f'profiles/{User}_gallery', max_length=255)

通过将
form=PicturePostForm(request.POST)
替换为
form=PicturePostForm(request.POST,request.FILES)

我以前尝试过完成代码,请遵循

视图

@login_required()
def picture_post(request):
    """
    Creates new picture post
    """
    form = PicturePostForm(request.POST or None, request.FILES or None)
    if request.method == "POST":
        if form.is_valid():
            # instance new object p_post (this best practice if using forms.ModelForm)
            # commit=False (to save data on ram/memory device without database/hardrive)
            p_post = form.save(commit=False)

            # assign author attribute from thr current user session
            p_post.author = request.user

            # commit=True to move/save data from memory to harddrive
            p_post.save() # p_post.save(commit=True)

            return redirect('home')
        else:
            l = []
            for i in form.errors.keys():
                l.append(form.errors[i])
            return HttpResponse(l)

    post_type = 'picture'
    return render(request, 'create_post.html', {'form': form, 'post_type': post_type})

不建议使用此代码content=form.cleaned_data['description']初始化变量以赋值,因为本例在forms.Oh上使用了forms.ModelForm!好的,谢谢你提供的信息;我甚至没想过。
@login_required()
def picture_post(request):
    """
    Creates new picture post
    """
    form = PicturePostForm(request.POST or None, request.FILES or None)
    if request.method == "POST":
        if form.is_valid():
            # instance new object p_post (this best practice if using forms.ModelForm)
            # commit=False (to save data on ram/memory device without database/hardrive)
            p_post = form.save(commit=False)

            # assign author attribute from thr current user session
            p_post.author = request.user

            # commit=True to move/save data from memory to harddrive
            p_post.save() # p_post.save(commit=True)

            return redirect('home')
        else:
            l = []
            for i in form.errors.keys():
                l.append(form.errors[i])
            return HttpResponse(l)

    post_type = 'picture'
    return render(request, 'create_post.html', {'form': form, 'post_type': post_type})