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表单未保存默认图像名称_Django_Django Forms - Fatal编程技术网

Django表单未保存默认图像名称

Django表单未保存默认图像名称,django,django-forms,Django,Django Forms,我有一个表单,其中包括上传图像的选项。在我的模型中,我定义了一个默认图像名称,在没有选择要上载的图像时使用。选择文件时,表单会将文件上载到“我的媒体”目录,并将文件名正确地放置在db字段中(按它应该的方式工作)。不选择文件时,该字段在数据库中保留为空。使用Django Admin将项目添加到同一个db表时,如果未选择图像,则默认文件名将正确放置在db字段中(如果选择图像,则默认文件名将正常工作)。只有在使用表单而不选择图像时,它才会正常工作。我已经四处找了一段时间,但还没有找到任何可以帮助我的方

我有一个表单,其中包括上传图像的选项。在我的模型中,我定义了一个默认图像名称,在没有选择要上载的图像时使用。选择文件时,表单会将文件上载到“我的媒体”目录,并将文件名正确地放置在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%}添加啤酒{%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
                    )
    ...