Загрузка файлов/изображений в Django не отвечает
Я просмотрел около 8 руководств на YouTube и веб-сайтах в Интернете. Я считаю, что все настроено правильно. Однако, когда мои объекты создаются, он не создает медиа директорию или не сохраняет файлы. Я сделал файл настроек, урлы, представления, модели все. Любой совет будет высоко оценен Вот мои файлы:
// setting.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
// models.py
class Trip(models.Model):
city = models.CharField(max_length= 255)
country = models.CharField(max_length= 255)
description = models.CharField(max_length= 255)
creator = models.ForeignKey(User, related_name = 'trips_uploaded',on_delete= CASCADE, null=True)
favoriter = models.ManyToManyField(User, related_name= 'fav_trips')
photo = models.ImageField(null=True, blank =True, upload_to='trips')
// urls.py ( there were 2 ways to write media according to tutorial)
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('travelsiteapp.urls'))
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
// views.py (lastly)
def tripAdd(request):
form = TripForm()
if request.method == 'POST':
form = TripForm(request.POST, request.FILES)
if form.is_valid():
form.photo = form.cleaned_data["photo"]
form.save()
context = { 'form': form}
return render(request, 'tripAdd.html', context)
// I have hit all the steps not sure whats wrong? & and installed pip pillow
В вашей модели forms.py
нет необходимости воссоздавать существующие поля из вашей модели.
class TripForm(ModelForm):
# city = forms.TextInput()
# country = forms.TimeField()
# description = forms.Textarea()
# photo = forms.ImageField()
# The above is not necessary here...
class Meta:
model = Trip
# These it should be since the model does have these fields
fields = ['city', 'country', 'description', 'photo']
Однако, в вашем файле views.py
в методе tripAdd
, в той строке, где я вижу у вас form.photo = form.cleaned_data['photo']
, это также не нужно. Просто закомментируйте/удалите эту строку и просто вызовите метод save
на форме.
form = TripForm(request.POST, request.FILES)
if form.is_valid():
# form.photo = form.cleaned_data["photo"]
form.save()
Дополнительно, я бы предложил использовать /
при работе с папками в качестве лучшей практики.
В модели Trip
:
photo = models.ImageField(upload_to='trips/', null=True, blank =True)
В urls.py
проекте добавьте следующее:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('travelsiteapp.urls'))
] # + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# Adding the media url/path if Debug is true
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)