Django表单未保存默认图像名称
我有一个表单,其中包括上传图像的选项。在我的模型中,我定义了一个默认图像名称,在没有选择要上载的图像时使用。选择文件时,表单会将文件上载到“我的媒体”目录,并将文件名正确地放置在db字段中(按它应该的方式工作)。不选择文件时,该字段在数据库中保留为空。使用Django Admin将项目添加到同一个db表时,如果未选择图像,则默认文件名将正确放置在db字段中(如果选择图像,则默认文件名将正常工作)。只有在使用表单而不选择图像时,它才会正常工作。我已经四处找了一段时间,但还没有找到任何可以帮助我的方法。有什么想法吗?非常感谢您的帮助 models.pyDjango表单未保存默认图像名称,django,django-forms,Django,Django Forms,我有一个表单,其中包括上传图像的选项。在我的模型中,我定义了一个默认图像名称,在没有选择要上载的图像时使用。选择文件时,表单会将文件上载到“我的媒体”目录,并将文件名正确地放置在db字段中(按它应该的方式工作)。不选择文件时,该字段在数据库中保留为空。使用Django Admin将项目添加到同一个db表时,如果未选择图像,则默认文件名将正确放置在db字段中(如果选择图像,则默认文件名将正常工作)。只有在使用表单而不选择图像时,它才会正常工作。我已经四处找了一段时间,但还没有找到任何可以帮助我的方
class Beer(models.Model):
beername = models.CharField(max_length=150)
brewer = models.ForeignKey(Brewery)
style = models.ForeignKey(BeerStyle)
abv = models.DecimalField(max_digits=4, decimal_places=2)
beerdescription = models.TextField()
picture = models.ImageField(upload_to='site_media/pictures/',
default='pictures/no_beer_picture.jpg')
def __unicode__(self):
return self.beername
forms.py
class BeerAddForm(forms.Form):
beername = forms.CharField(
label=u'Name',
widget=forms.TextInput(attrs={'size': 75})
)
style = forms.ModelChoiceField(
BeerStyle.objects.all(),
label=u'Style',
widget=forms.Select()
)
abv = forms.DecimalField(
label=u'ABV',
widget=forms.TextInput(attrs={'size': 8})
)
beerdescription = forms.CharField(
label=u'Description',
widget=forms.Textarea
)
picture = forms.ImageField(
required=False,
label=u'Picture',
widget=forms.FileInput,
initial='pictures/no_beer_picture.jpg'
)
views.py
def beeradd(request, brewery_id):
brewery = get_object_or_404(Brewery, id=brewery_id)
if request.method == 'POST':
form = BeerAddForm(request.POST, request.FILES)
if form.is_valid():
# Create or get beer
beer = Beer.objects.create(
beername = form.cleaned_data['beername'],
brewer = brewery,
style = form.cleaned_data['style'],
abv = form.cleaned_data['abv'],
beerdescription = form.cleaned_data['beerdescription'],
picture = form.cleaned_data['picture']
)
return HttpResponseRedirect('/beers/')
else:
form = BeerAddForm()
variables = RequestContext(request, {
'form': form
})
return render_to_response('beer_add.html', variables)
beer_add.html(相关表单)
{%extends“base.html”%}
{%block title%}添加啤酒{%endblock%}
{%block head%}添加啤酒{%endblock%}
{%block content%}
{{form.as_p}}
{%endblock%}
在用户提交表单后,我会在视图代码中设置默认值。因此,将picture的初始参数从表单定义中去掉,在您的视图中执行如下操作:
def beeradd(request, brewery_id):
brewery = get_object_or_404(Brewery, id=brewery_id)
if request.method == 'POST':
form = BeerAddForm(request.POST, request.FILES)
if form.is_valid():
# Create or get beer
pic = form.cleaned_data['picture']
if not pic:
pic = 'pictures/no_beer_picture.jpg'
beer = Beer.objects.create(
beername = form.cleaned_data['beername'],
brewer = brewery,
style = form.cleaned_data['style'],
abv = form.cleaned_data['abv'],
beerdescription = form.cleaned_data['beerdescription'],
picture = pic
)
...
我认为您看到的问题是,初始值可能会用该值填充文件字段,但当表单提交时,值“pictures/no_beer_picture.jpg”在用户计算机上不是有效的文件,因此表单不会发送任何文件。在尝试保存模型之前,您可以通过打印出form.cleaned_数据['picture']来验证发送的内容
您可能需要检查是否可以只为Beer上的picture属性分配字符串值,或者是否确实需要分配文件。@kfordham281-您只需缩进代码(使用Ctrl-K或编辑器中的1010图标)即可正确显示
。非常感谢您的代码。我试过了,效果很好。在上述示例或其他视图中设置默认数据是最佳做法吗?我还在冲洗我的干代码。谢谢不确定它是否是设置默认值的最佳位置,但就干的情况而言,只要你不在其他地方重复这一点,它就和任何地方一样好,因为它只在一个地方。如果你发现自己需要在其他地方使用这个值,就把它放在一个常数中。
def beeradd(request, brewery_id):
brewery = get_object_or_404(Brewery, id=brewery_id)
if request.method == 'POST':
form = BeerAddForm(request.POST, request.FILES)
if form.is_valid():
# Create or get beer
pic = form.cleaned_data['picture']
if not pic:
pic = 'pictures/no_beer_picture.jpg'
beer = Beer.objects.create(
beername = form.cleaned_data['beername'],
brewer = brewery,
style = form.cleaned_data['style'],
abv = form.cleaned_data['abv'],
beerdescription = form.cleaned_data['beerdescription'],
picture = pic
)
...