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
来避免这种情况。我应该补充一点,如果我选择了一张新照片,它将很好地上传,问题是当我离开该字段并修改其他字段时。您似乎离开了要求