Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django-I';“我得到了”;此字段为必填字段;更新对象时出错_Django_File Upload_Django Forms - Fatal编程技术网

Django-I';“我得到了”;此字段为必填字段;更新对象时出错

Django-I';“我得到了”;此字段为必填字段;更新对象时出错,django,file-upload,django-forms,Django,File Upload,Django Forms,当我尝试使用表单编辑包含图像上传的对象时,我得到“此字段是必需的”。类似的表单可以很好地创建对象,但是当我检索对象并尝试修改其他字段时,它在图像上失败 #-------models.py: class Star(models.Model): firstname = models.CharField(max_length=32) lastname = models.CharField(max_length=32, blank=True) portrait = models.

当我尝试使用表单编辑包含图像上传的对象时,我得到“此字段是必需的”。类似的表单可以很好地创建对象,但是当我检索对象并尝试修改其他字段时,它在图像上失败

#-------models.py:
class Star(models.Model):
    firstname = models.CharField(max_length=32)
    lastname = models.CharField(max_length=32, blank=True)
    portrait = models.ImageField(upload_to='images/')

#------views.py:
class StarForm(forms.ModelForm):
    class Meta:
        model = Star
        fields = ["firstname", "lastname", "portrait"]

def staredit(request, star_id):
    instance = Star.objects.get(pk=star_id)
    form = StarForm(request.POST or None, instance=instance)
    context = {
        "form": form,
    }
    return render(request, "stars/edit.html", context)


def starchange(request):
    form = StarForm(request.POST, request.FILES)
    if form.is_valid():
        newstar.save()
        context = {
            "message": "The form was posted",
        }
        return render(request, "stars/edit.html", context)
    else:
        context = {
            "message": form.errors,
        }
        return render(request, "stars/edit.html", context)

#-----edit.html
<form action="/starchange" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>
{{message}}
#----models.py:
星级(型号.型号):
firstname=models.CharField(最大长度=32)
lastname=models.CharField(最大长度=32,空白=True)
肖像=模型.ImageField(上传到='images/')
#------views.py:
类星型(forms.ModelForm):
类元:
型号=星型
字段=[“姓氏”、“姓氏”、“肖像”]
def staredit(请求,star_id):
instance=Star.objects.get(pk=Star\u id)
form=StarForm(request.POST或None,instance=instance)
上下文={
“形式”:形式,
}
返回渲染(请求“stars/edit.html”,上下文)
def starchange(请求):
form=StarForm(request.POST、request.FILES)
如果form.is_有效():
newstar.save()
上下文={
“消息”:“表单已发布”,
}
返回渲染(请求“stars/edit.html”,上下文)
其他:
上下文={
“消息”:form.errors,
}
返回渲染(请求“stars/edit.html”,上下文)
#-----edit.html
{%csrf_令牌%}
{{form.as_p}}
{{message}}
错误消息:

肖像画 此字段为必填字段

您没有更新实例,因为您从未将实例传递给应该更新它的视图。进行POST请求时,浏览器仅提交表单元素的内容。没有关于上一个表单呈现内容的数据,该数据将丢失

您应该指定要更新的
实例
,以便:

from django.shortcuts import get_object_or_404

def starchange(request, pk):
    obj = get_object_or_404(Star, pk=pk)
    form = StarForm(request.POST, request.FILES, instance=obj)
    if form.is_valid():
        form.save()
        context = {
            "message": "The form was posted",
        }
        return render(request, "stars/edit.html", context)
    else:
        context = {
            "message": form.errors,
        }
        return render(request, "stars/edit.html", context)
从django.shortcuts导入get\u object\u或\u 404
def starchange(请求,主键):
obj=获取对象或404(星形,主键=主键)
form=StarForm(request.POST,request.FILES,instance=obj)
如果form.is_有效():
form.save()
上下文={
“消息”:“表单已发布”,
}
返回渲染(请求“stars/edit.html”,上下文)
其他:
上下文={
“消息”:form.errors,
}
返回渲染(请求“stars/edit.html”,上下文)
因此,在URL中,您应该指定要更新的对象的主键:

urlpatterns = [
    # …,
    path('starchange/<int:pk>/', views.starchange, name='starchange')
]
urlpatterns=[
# …,
路径('starchange/',views.starchange,name='starchange')
]
在模板中,您应该对具有给定实例的视图发出POST请求:

<form action="{% url 'starchange' pk=form.instance.pk %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>

{%csrf_令牌%}
{{form.as_p}}
这是为什么GET和POST请求经常使用同一个视图的主要原因之一,因为它会删除大量重复的逻辑。此外,它也更干净:您可以使用GET检索页面,并使用POST提交页面


注意:如果POST请求成功,您应该 实施。 这样可以避免在用户刷新日志时发出相同的POST请求 浏览器


注意:使用, 然后直接使用。如果对象不存在, 例如,由于用户自己更改了URL,
get\u object\u或_404(…)
将返回HTTP 404 Not Found响应,而使用
.get(…)
将导致HTTP 500服务器错误

您没有更新实例,因为您从未将实例传递给应该更新它的视图。进行POST请求时,浏览器仅提交表单元素的内容。没有关于上一个表单呈现内容的数据,该数据将丢失

您应该指定要更新的
实例
,以便:

from django.shortcuts import get_object_or_404

def starchange(request, pk):
    obj = get_object_or_404(Star, pk=pk)
    form = StarForm(request.POST, request.FILES, instance=obj)
    if form.is_valid():
        form.save()
        context = {
            "message": "The form was posted",
        }
        return render(request, "stars/edit.html", context)
    else:
        context = {
            "message": form.errors,
        }
        return render(request, "stars/edit.html", context)
从django.shortcuts导入get\u object\u或\u 404
def starchange(请求,主键):
obj=获取对象或404(星形,主键=主键)
form=StarForm(request.POST,request.FILES,instance=obj)
如果form.is_有效():
form.save()
上下文={
“消息”:“表单已发布”,
}
返回渲染(请求“stars/edit.html”,上下文)
其他:
上下文={
“消息”:form.errors,
}
返回渲染(请求“stars/edit.html”,上下文)
因此,在URL中,您应该指定要更新的对象的主键:

urlpatterns = [
    # …,
    path('starchange/<int:pk>/', views.starchange, name='starchange')
]
urlpatterns=[
# …,
路径('starchange/',views.starchange,name='starchange')
]
在模板中,您应该对具有给定实例的视图发出POST请求:

<form action="{% url 'starchange' pk=form.instance.pk %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit">
</form>

{%csrf_令牌%}
{{form.as_p}}
这是为什么GET和POST请求经常使用同一个视图的主要原因之一,因为它会删除大量重复的逻辑。此外,它也更干净:您可以使用GET检索页面,并使用POST提交页面


注意:如果POST请求成功,您应该 实施。 这样可以避免在用户刷新日志时发出相同的POST请求 浏览器


注意:使用, 然后直接使用。如果对象不存在, 例如,由于用户自己更改了URL,
get\u object\u或_404(…)
将返回HTTP 404 Not Found响应,而使用
.get(…)
将导致HTTP 500服务器错误


我应该补充一点,如果我选择了一张新照片,它将很好地上传,问题是当我离开该字段并修改其他字段时。似乎您在代码的某个地方将所需的字段肖像留空。您可以通过在星形模型的字段定义中添加
blank=True
来避免这种情况。我应该补充一点,如果我选择了一张新照片,它将很好地上传,问题是当我离开该字段并修改其他字段时。您似乎离开了要求