Невозможно загрузить изображение в Django Project, получение объекта формы не имеет атрибута «сохранить» - PullRequest
2 голосов
/ 21 января 2020

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

AttributeError: 'PicUpForm' object has no attribute 'save'

и, следовательно, мое изображение не загружается в указанный каталог, а запись не вставляется в мой sqlitedb

СЛЕДУЮТ ВСЕМ НЕОБХОДИМЫМ КОДАМ, КОТОРЫМ Я ИСПОЛЬЗОВАЛ:

views.py

def add_image(request):
    form = PicUpForm()
    if request.method == "POST":
        form = PicUpForm(data=request.POST, files=request.FILES)
    if form.is_valid():
        form.save()
        return redirect("")
    else:
        return render(request, "sample.html", {"form": form})

forms.py

class PicUpForm(forms.Form):
    class Meta:
        model = PicUpClass
        fields = [model.picture]
    picture = forms.ImageField(label='File')

models.py

def upload_to(instance, filename):
    now = timezone_now()
    base, ext = os.path.splitext(filename)
    ext = ext.lower()
    return f"C:/Users/Aayush/ev_manage/face_detector/static/img/{now:%Y/%m/%Y%m%d%H%M%S}{ext}"



class PicUpClass(models.Model):
    picture = models.ImageField(_("picture"), upload_to=upload_to, blank=True, null=True)

образец. html

{% block content %}
{% load static %}
    <form method="post" action="/picup" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form }}
        <button type="submit">submit</button>
    </form>
{% endblock %}

urls .py

...
path('picup', views.add_image, name='picup'),

Также я запустил команды makemigrations и migrate после создания модели по мере необходимости. Пожалуйста, помогите мне, поскольку я ладья ie в Python, и очень важно, чтобы завершить эту функцию

1 Ответ

2 голосов
/ 21 января 2020

Ваш PicUpForm равен , а не a ModelForm, следовательно, Meta не будет учитываться вообще. Обратите внимание, что поля должны быть списком строк, поэтому вы должны переписать форму так: * вида, поэтому:

def add_image(request):
    if request.method == 'POST':
        form = PicUpForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.save()
            return redirect(<i>'name-of-view'</i>)
    else:
        form = PicUpForm()
    return render(request, 'sample.html', {'form': form})

Здесь вам необходимо заменить name-of-view на имя представления.

Если представление содержит параметр, Вы можете передать это как именованный параметр, например, здесь, если у вашего представления есть параметр picture_id (если у него есть другой параметр, тогда, конечно, вы должны изменить имя параметра):

def add_image(request):
    if request.method == 'POST':
        form = PicUpForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            <b>picup =</b> form.save()
            return <b>redirect(<i>'name-of-view'</i>, picture_id=picup.pk)</b>
    else:
        form = PicUpForm()
    return render(request, 'sample.html', {'form': form})
...