Проблема с загрузкой в Django
Пожалуйста, кто-нибудь может помочь с проблемой, с которой я столкнулся в Django?
Я создал приложение с рецептами для курсового проекта и хочу, чтобы пользователь мог загружать изображения. Я настроил модель, и когда я загружаю изображение со страницы администратора django, она отлично работает, однако когда я пытаюсь загрузить изображение из пользовательского интерфейса, она не работает, а ведь она должна использовать ту же модель. Другие поля CharField, TextField и IntergerField работают, но не ImageField, и я не знаю, почему. Есть также стандартный файл no_picture.jpg, но он тоже не используется.
когда Img работает, url отображается как
и когда это не так, /recipes/ отсутствует в URL
Однако я не думаю, что проблема в моих urlpatterns, так как другие данные работают, а только изображение.
Вот models.py
class Recipe(models.Model):
name = models.CharField(max_length = 120)
cooking_time = models.IntegerField(help_text = 'in mintues', default = 0 )
ingredients = models.CharField(max_length = 300)
description = models.TextField()
pictures = models.ImageField(upload_to = 'recipes', default = 'no_picture.jpg')
forms.py
class CreateRecipeForm(forms.Form):
name = forms.CharField(max_length=50, required=False)
cooking_time = forms.IntegerField(help_text='in minutes', required=False)
ingredients = forms.CharField(max_length=300, required=False)
description = forms.CharField(max_length=500, required=False)
pictures = forms.ImageField(required=False)
views.py
@login_required
def create_view(request):
create_form = CreateRecipeForm(request.POST or None, request.FILES)
name = None
cooking_time = None
ingredients = None
description = None
pictures = None
if request.method == 'POST':
try:
recipe = Recipe.objects.create(
name = request.POST.get('name'),
cooking_time = request.POST.get('cooking_time'),
ingredients = request.POST.get('ingredients'),
description = request.POST.get('description'),
pictures = request.POST.get('pictures')
)
recipe.save()
except:
print('Error!!!')
context = {
'create_form': create_form,
'name': name,
'cooking_time': cooking_time,
'ingredients': ingredients,
'description': description,
'pictures': pictures,
}
return render(request, 'recipes/create.html', context)
или, если проще, вот ссылка на репозиторий GitHub
https://github.com/Jonathlon/django-app/tree/main/src
Спасибо
Здесь я могу показать вам, как создается Django форма, поэтому вы можете получить данные из полей, используя form.cleaned_data['field_name']
вместо request.POST.get('field_name')
попробуйте следующий подход.
@login_required
def create_view(request):
create_form = CreateRecipeForm(request.POST or None, request.FILES)
if request.method == 'POST':
if create_form.is_valid():
name = create_form.cleaned_data['name']
cooking_time = create_form.cleaned_data['cooking_time']
ingredients = create_form.cleaned_data['ingredients']
description = create_form.cleaned_data['description']
pictures = create_form.cleaned_data['pictures']
# Create Recipe object with image field assigned to the file object
recipe = Recipe.objects.create(
name=name,
cooking_time=cooking_time,
ingredients=ingredients,
description=description,
pictures=pictures
)
return render(request, 'recipes/success.html') # Redirect to success page or any other page
else:
print('Form is not valid')
context = {'create_form': create_form}
return render(request, 'recipes/create.html', context)
Похоже, что проблема заключается в том, как вы обращаетесь с файлом изображения в вашем create_view
. В частности, при создании экземпляра Recipe
вы пытаетесь присвоить request.POST.get('pictures')
полю pictures. Однако request.POST
используется для текстовых данных, а не для файловых. Для файловых данных следует использовать request.FILES
:
recipe = Recipe.objects.create(
name=request.POST.get('name'),
cooking_time=request.POST.get('cooking_time'),
ingredients=request.POST.get('ingredients'),
description=request.POST.get('description'),
pictures=request.FILES.get('pictures', 'no_picture.jpg')
)