Django ModelForm говорит, что поле изображения обязательно при отправке, даже если указано правильное изображение - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь использовать ModelForm для сохранения объектов в базе данных. Я также добавил ImageField. Через панель администратора я легко могу добавлять объекты с изображением, но каждый раз, когда я отправляю ModelForm с тем же изображением, оно не сохраняется и возвращает сообщение об ошибке «Это поле обязательно» (скриншот и код прилагаются). Как это исправить?

Вот скриншот ошибки: Even when choosing a valid image and submitting, it says field is required.

Файл модели:

from django.db import models
from django.conf import settings


class Book(models.Model):
    rel_user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name="Posted By")
    image = models.ImageField(verbose_name="Image", upload_to="static/Books/img")
    title = models.CharField(max_length=256, verbose_name="Title")
    description = models.TextField(verbose_name="Description")
    price = models.IntegerField(verbose_name="Price")
    state = models.CharField(max_length=256, verbose_name="State")
    city = models.CharField(max_length=256, verbose_name="City")
    neighbourhood = models.CharField(max_length=256, verbose_name="Neighbourhood")
    phone = models.IntegerField(verbose_name="Phone Number")

    def __str__(self):
        return self.title + f" ({self.rel_user.username})"

Файл форм :

from django.forms import ModelForm
from Books.models import Book


class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ['image', 'title', 'description', 'price', 'state', 'city', 'neighbourhood', 'phone']

Файл просмотра:

from django.shortcuts import render, redirect
from Books.forms import BookForm
from django.contrib import messages
from Books.models import Book


def sell(request):
    if request.method == "GET":
        form = BookForm()
    else:
        form = BookForm(request.POST)
        form.instance.rel_user = request.user
        if form.is_valid():
            form.save()
            messages.success(request, "Successfully added!")
            return redirect('sell')
        else:
            messages.error(request, "Please fill in all the fields.")
    return render(request, 'Books/sell.html', {"form": form})

Код HTML:

<div class="container" style="padding: 2%">
        <div class="row">
            <div class="col-md-4 col-sm-4 col-xs-12"></div>
            <div class="col-md-4 col-sm-4 col-xs-12" style="background-color: rgba(256, 256, 256, 0.8);">
                {% if messages %}
                    {% for message in messages %}
                        <div class="alert alert-primary" role="alert" style="margin-top: 2%;">
                            {{ message }}
                        </div>
                    {% endfor %}
                {% endif %}
                <form method="POST" action="{% url 'sell' %}">
                    {% csrf_token %}
                    <fieldset class="form-group">
                        <legend class="border-bottom mb-4">Sell A Book</legend>
                        {{ form|crispy }}
                    </fieldset>
                    <div class="form-group">
                        <button class="btn btn-outline-info" type="submit">Submit
                        </button>
                    </div>
                </form>
            </div>
            <div class="col-md-4 col-sm-4 col-xs-12"></div>
        </div>
    </div>

1 Ответ

2 голосов
/ 10 января 2020
from Books.forms import BookForm
from django.contrib import messages
from Books.models import Book


def sell(request):
    if request.method == "GET":
        form = BookForm()
    else:
        form = BookForm(request.POST,request.FILES)
        form.instance.rel_user = request.user
        if form.is_valid():
            form.save()
            messages.success(request, "Successfully added!")
            return redirect('sell')
        else:
            messages.error(request, "Please fill in all the fields.")
    return render(request, 'Books/sell.html', {"form": form})```


<div class="container" style="padding: 2%">
        <div class="row">
            <div class="col-md-4 col-sm-4 col-xs-12"></div>
            <div class="col-md-4 col-sm-4 col-xs-12" style="background-color:rgba(256, 256, 256, 0.8);">
                {% if messages %}
                    {% for message in messages %}
                        <div class="alert alert-primary" role="alert" style="margin-top: 2%;">
                            {{ message }}
                        </div>
                    {% endfor %}
                {% endif %}
                <form method="POST" action="{% url 'sell' %}"enctype="multipart/form-data">
                    {% csrf_token %}
                    <fieldset class="form-group">
                        <legend class="border-bottom mb-4">Sell A Book</legend>
                        {{ form|crispy }}
                    </fieldset>
                    <div class="form-group">
                        <button class="btn btn-outline-info" type="submit">Submit
                        </button>
                    </div>
                </form>
            </div>
            <div class="col-md-4 col-sm-4 col-xs-12"></div>
        </div>
    </div>


...