我有一个表单,其中包含上传图片的选项。在我的模型中,我已经定义了在没有选择上传图像时使用的默认图像名称。选择文件时,表单会将文件上传到我的媒体目录,并将文件名正确放入db字段(按预期工作)。如果不选择文件,则该字段在数据库中保留为空白。使用Django Admin将项添加到同一个db表时,默认文件名在没有选择图像时正确放置在db字段中(并且在选择图像时正常工作)。只有在使用表单而不选择图像时它才能正常工作。我环顾四周,但还没有想出任何有用的东西。有任何想法吗?非常感谢任何帮助。
models.py
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 %}Add a Beer{% endblock %}
{% block head %}Add a Beer{% endblock %}
{% block content %}
<form enctype="multipart/form-data" method="post" action=".">
{{ form.as_p }}
<input type="submit" value="save" />
</form>
{% endblock %}
答案 0 :(得分:0)
我会在用户提交表单后在视图代码中设置默认值。因此,从表单定义中获取图片的初始参数,并在您的视图中执行以下操作:
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_data ['picture']来验证发送的内容。
您可能需要检查是否可以为Beer上的图片属性指定字符串值,或者您是否确实需要指定文件。