Проблема с загрузкой в Django

Пожалуйста, кто-нибудь может помочь с проблемой, с которой я столкнулся в Django?

Я создал приложение с рецептами для курсового проекта и хочу, чтобы пользователь мог загружать изображения. Я настроил модель, и когда я загружаю изображение со страницы администратора django, она отлично работает, однако когда я пытаюсь загрузить изображение из пользовательского интерфейса, она не работает, а ведь она должна использовать ту же модель. Другие поля CharField, TextField и IntergerField работают, но не ImageField, и я не знаю, почему. Есть также стандартный файл no_picture.jpg, но он тоже не используется.

когда Img работает, url отображается как

working url

и когда это не так, /recipes/ отсутствует в URL

non working 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')
            )


Вернуться на верх