Изображение не загружается в базу данных. ValueError. Атрибут 'image' не имеет связанного с ним файла - PullRequest
0 голосов
/ 25 апреля 2019

Я работаю над проектом (простой сайт в социальных сетях). Зарегистрированные пользователи должны создавать сообщения с текстом и изображением.

Когда я отправляю форму, изображение не загружается, и возникает ошибка ValueError, сообщающая, что у атрибута 'image' нет файла, связанного с ним.

Единственный способ прикрепить изображение к сообщению - из админ-панели, но я не хочу этого делать.

Я думаю, что есть проблема в views.py - я видел много постов, где это делается с помощью представлений на основе функций, но мне не удалось найти решение с помощью представлений на основе классов.

Я довольно новичок в Django и, скорее всего, мне не хватает чего-то маленького (или, по крайней мере, я на это надеюсь).

Не могли бы вы взглянуть и посоветовать, как поступить. Любая помощь будет высоко ценится!

models.py

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(null=True)
    image = models.ImageField(upload_to='post_pics/', null=True, blank=True)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

views.py - CBV для создания поста

class PostCreateView(LoginRequiredMixin, CreateView):
    model = Post
    fields = ['title', 'content', 'image']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Убедитесь, что в вашей форме есть энктип, например

<form role="form" method="post" enctype="multipart/form-data">
0 голосов
/ 25 апреля 2019

Изображение не загружается в базу данных.

Пожалуйста, не делай этого.
Есть несколько серьезных ограничений, которые вы должны иметь в виду:

Если вы храните статические данные (изображения / видео / и т. Д.) В какой-либо папке в хранилище бэкэнда, вы, вероятно, столкнетесь с проблемой, когда вам потребуется еще один бэкэнд-сервер. Очень вероятно, что эта папка должна быть покрыта какой-то репликацией файловой системы.

Если вы храните статические данные прямо в базе данных - это может быть еще хуже. Реляционные базы данных не предназначены для огромного двоичного трафика, и вы очень быстро столкнетесь с падением производительности.

Рекомендованный способ - хранить контент такого типа непосредственно на некотором CDN . Это немного сложнее, но в середине. В перспективе это самый эффективный способ. Это привело бы к эффективной доставке статического контента, хорошему кешированию, эффективному распределению трафика (меньше трафика на ваши передние серверы == лучшая производительность), и, в конечном итоге, сохранит вашу базу данных крошечной и быстрой.

...