Как загрузить изображение на Django - PullRequest
0 голосов
/ 29 мая 2020

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

# settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_URL = '/media/' 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# forms.py
from .models import Pic
from django import forms
class ImageForm(forms.ModelForm):
    class Meta:
        model= Pic
        fields= ["picture"]
# models.py
class Pic(models.Model):
    picture = models.ImageField(upload_to = 'media/', default = 'media/None/no-img.jpg', null=True, blank= True)
# views.py
def upload(request):
    form = ImageForm
    context = {}
    userBio = Bio.objects.get(userData = User.objects.get(id = request.session['client']['id']))
    if request.method == 'POST':
        # .is_valid checks the models parameters via forms method
        form = ImageForm(request.POST,request.FILES)
        if form.is_valid():
            form.save()
            print("succesful uploaded image")
            return redirect("/dashboard")
        else:
            print("Not a valid input from form....")
            messages.error(request,"Not a valid input")
    return redirect("/dashboard")
<!-- dashboard.html -->
<form rule="form" class="border border--secondary" method="POST" action="/manageFile" enctype="multipart/form-data">
    {% csrf_token%}
    <input type="file" name = "update">
    <input type = "submit">
</form>
{% if pictures %}
    {% for pic in pictures%}
        <img src="{{pic}}" alt="{{pic}}">
    {% endfor %}
{% endif%}

В шаблоне он отображается как Pi c object (1). В терминале он отображается как

Query set Pi c: Pi c object (1)

Вот что я визуализирую в шаблоне.

def dash(request):
    try:
        _id = request.session['client']['id']
    except:
        return redirect("/loginPg")

    userBio = Bio.objects.get(userData = User.objects.get(id = request.session['client']['id']))
    print("its right here")
    theUploads = Pic.objects.all()
    print("This image object -", theUploads)

    content = {
        "title" : userBio.title,
        "qA" : userBio.quoteA,
        "qB" : userBio.quoteB,
        "desc" : userBio.desc,
        "authorA" : userBio.authorA,
        "authorB" : userBio.authorB,
        "pictures" : theUploads
    }

    return render(request, "GoEnigma/dashboard.html", content)
# urls.py
from django.conf.urls.static import static
from django.conf import settings
# urls []
if settings.DEBUG:
     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Ответы [ 3 ]

1 голос
/ 02 июня 2020

Это было трудно обнаружить, потому что вы сами визуализируете поле формы:

class ImageForm(forms.ModelForm):
    class Meta:
        model= Pic
        fields= ["picture"]
    <input type="file" name = "update">

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

0 голосов
/ 02 июня 2020

Если изображение сохраняется в базе данных, то ошибка при визуализации шаблона. Для рендеринга изображений в шаблоне вам необходимо получить {{model_class.model_fields.url}}, поэтому в вашем случае классом является pi c, а поле - изображение. попробуйте это в своем шаблоне <img src="{{pic.picture.url}}">

0 голосов
/ 29 мая 2020

поставьте скобки после ImageForm и добавьте request.POST в ImageForm, если это Post request.


def upload:
  form = ImageForm()
  if request.method == 'POST':
    # .is_valid checks the models parameters via forms method
    form = ImageForm(request.POST, request.FILES)
    if form.is_valid():
        form.save()
        print("succesful uploaded image")
        return redirect("/dashboard")
    else:
        print("Not a valid input from form....")
        messages.error(request,"Not a valid input")
return redirect("/dashboard")

Также проверьте, может быть, вы не добавили URL-адрес для обслуживания медиафайлов, поэтому добавьте следующие строки в urls.py файл main project.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
  # ..... all regular paths
] 
if setting.DEBUG: # if true
  urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Официальные документы здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...