• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

AttributeError przy próbie dodania obrazu django

Object Storage Arubacloud
0 głosów
443 wizyt
pytanie zadane 21 marca 2020 w Python przez Aqua Obywatel (1,950 p.)

Ostatnio próbowałem przejść tutorial dotyczący dodawania zdjęć do bazy danych w Django: Link do tutoriala, jednak gdy wszystko przepisałem (gdy już nie działało dla pewności wszystko skopiowałem), wyświetlił mi się następujący komunikat na stronie:

Exception Type: AttributeError

Exception Value: 'NoneType' object has no attribute 'imagefile'

Exception Location: C:\project\app\views.py in showimage, line 246

Wyjątek został rzucony w tym miejscu:

C:\project\app\views.py in showimage, line 246:

imagefile= lastimage.imagefile

 

Cały kod wygląda tak:

settings.py:


#...

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'django.template.context_processors.media',
            ],
        },
    },
]

#...

STATIC_URL = '/static/'

MEDIA_ROOT= os.path.join(BASE_DIR, 'media/')
MEDIA_URL= "/media/"

 

urls.py:

from django.contrib import admin
from django.urls import include, path

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


urlpatterns = [
    path('strike/', include('app.urls')),
    path('admin/' , admin.site.urls),
] + static(settings.MEDIA_URL, document_root= settings.MEDIA_ROOT)

 

app\models.py:


from django.db import models

class Image(models.Model):
    name= models.CharField(max_length=500)
    imagefile= models.FileField(upload_to='images/', null=True, verbose_name="")

    def __str__(self):
        return self.name + ": " + str(self.imagefile)


 

app\forms.py:


from django import forms
from .models import Image

class ImageForm(forms.ModelForm):
    class Meta:
        model= Image
        fields= ["name", "imagefile"]

 

app\views.py:

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, reverse
from django.utils import timezone
from .models import Image
from .forms import *

#...

def showimage(request):
    
    lastimage= Image.objects.last()

    imagefile= lastimage.imagefile # tu rzuca wyjątek


    form= ImageForm(request.POST, request.FILES)
    if form.is_valid():
        form.save()

    
    context= {'imagefile': imagefile,
              'form': form
              }
              
    
    return render(request, 'students/images.html', context)

 

images.html:

<html>
	<head>
		<meta charset="UTF-8">
		<title>Upload Images</title>
	</head>
	<body>

		<h1>Image Uploader</h1>
		<form enctype="multipart/form-data" method="POST" action="">
			{% csrf_token %}
			{{ form.as_p }}
			<input type="submit" value="Upload"/>
		</form>

		<br><br>
		<img src='{{ MEDIA_URL }}{{ imagefile }}'>
		<br><br>
		</p>

	</body>
	
	<script>'undefined'=== typeof _trfq || (window._trfq = []);'undefined'=== typeof _trfd && (window._trfd=[]),_trfd.push({'tccl.baseHost':'secureserver.net'}),_trfd.push({'ap':'cpsh'},{'server':'p3plcpnl0769'}) // Monitoring performance to make your website faster. If you want to opt-out, please contact web hosting support.</script><script src='https://img1.wsimg.com/tcc/tcc_l.combined.1.0.6.min.js'></script>
</html>

 - W czym jest błąd i jak go naprawić?

 - Najważniejsze: Czy ktoś może wytłumaczyć krok po kroku, jak powinno się dodawać zdjęcia do bazy danych  django, używając formularza (w sensie, że wytłumaczyć cały proces dodawania zdjęć do bazy danych, chodzi o wytłumaczenie, a nie o same linki)? 

 - Poza tym z jakich stron warto skorzystać, aby dowiedzieć się więcej o dodawaniu plików do baz danych w Django

 - Co robi skrypt wklejony na dole images.html.

 

Jestem początkujący w Django, więc proszę o wyrozumiałość.

 

 

 

 

 

 

 

1 odpowiedź

+1 głos
odpowiedź 21 marca 2020 przez adrian17 Ekspert (344,860 p.)
wybrane 21 marca 2020 przez Aqua
 
Najlepsza

Tak strzelam, ale...

    lastimage= Image.objects.last()
    imagefile= lastimage.imagefile # tu rzuca wyjątek

Jeśli nie ma jeszcze żadnych zdjęć, to `Image.objects.last()` zwróci None, wtedy oczywiście `.imagefile` się wywali.

Trzeba obsłużyć przypadek, w którym nie ma jeszcze zdjęć.

Co robi skrypt wklejony na dole images.html.

To... pytanie do Ciebie. Na końcu jest komentarz

// Monitoring performance to make your website faster. If you want to opt-out, please contact web hosting support

Poza tym z jakich stron warto skorzystać, aby dowiedzieć się więcej o dodawaniu plików do baz danych w Django

Te same, co wspomniałem ostatnio:

https://docs.djangoproject.com/en/3.0/topics/http/file-uploads/

https://docs.djangoproject.com/en/3.0/topics/files/

https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.FileField

A więcej można znaleźć po słowach kluczowych w googlu  'image upload view django'

komentarz 21 marca 2020 przez Aqua Obywatel (1,950 p.)
Działa!

Podobne pytania

0 głosów
1 odpowiedź 353 wizyt
pytanie zadane 5 września 2018 w Python przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
0 odpowiedzi 147 wizyt
0 głosów
1 odpowiedź 460 wizyt

92,552 zapytań

141,399 odpowiedzi

319,534 komentarzy

61,938 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...