Форма Django не сохраняет имя изображения по умолчанию

StackOverflow https://stackoverflow.com/questions/1644455

  •  10-07-2019
  •  | 
  •  

Вопрос

У меня есть форма, в которой есть возможность загрузить изображение.В моей модели я определил имя изображения по умолчанию, которое будет использоваться, когда для загрузки не выбрано изображение.При выборе файла форма загружает файл в мой медиа-каталог и правильно помещает имя файла в поле db (работает должным образом).Если файл не выбран, это поле в базе данных остается пустым.При добавлении элемента в ту же таблицу базы данных с помощью Django Admin имя файла по умолчанию правильно помещается в поле базы данных, когда изображение не выбрано (и работает правильно, когда изображение выбрано).Вот только при использовании формы без выбора изображения она работает некорректно.Я некоторое время оглядывался вокруг, но так и не нашел ничего, что могло бы помочь.Есть идеи?Буду признателен за любую оказанную помощь.

модели.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

формы.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'
)

view.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 %}
Это было полезно?

Решение

Я бы установил значение по умолчанию в коде представления после того, как пользователь отправил форму.Поэтому возьмите первоначальный аргумент для изображения из определения формы и сделайте что-то вроде этого, по вашему мнению:

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 или вам действительно нужно назначить файл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top