2009-10-29 64 views
1

我有一个表单,其中包含上传图像的选项。在我的模型中,我定义了一个默认图像名称,当没有图像被选择上传时使用。选择文件时,表单将文件上传到我的媒体目录,并将文件名正确放置在数据库字段中(正常工作)。当不选择文件时,该字段在数据库中留空。当使用Django Admin将项目添加到同一个数据库表格时,默认文件名在没有选择图像时正确放置在数据库字段中(并且在选择图像时可以正常工作)。只有在使用表单而不选择图像时才能正常工作。我已经看了一会儿,但还没有提出任何可能的帮助。有任何想法吗?任何帮助深表感谢。Django窗体不保存默认图像名称

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

@ kfordham281 - 您只需要在

'中显示正确显示的代码(使用Ctrl-K或编辑器中的1010图标) 。 – 2009-10-29 15:28:09

回答

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上的图片属性,或者实际上是否需要分配文件。

+0

非常感谢代码。我试了一下,效果很好。在上述示例或其他地方的视图中设置默认数据是否是最佳做法?我仍然清理掉我的DRY编码。谢谢! – kfordham281 2009-11-01 22:17:59

+0

不知道它是否是设置默认值的最佳位置,但只要DRY不变,只要您不在其他地方重复该操作,就可以设置默认值,因为它只在一个地方。如果您发现自己需要在其他地方使用该值,请考虑将该值保持不变。 – sheats 2009-11-02 14:55:43