@dt-wark

Почему не загружается изображение через ImageField?

Недавно начал изучать Django и наткнулся на проблему.

У меня есть модель поста для блога, в ней определено поле og_image, которое должно хранить картинку для соцсетей. При создании нового поста, я пытаюсь через форму загрузить картинку. Форма отправляется, но самой картинки нет в папке media/og_images, а ссылка в шаблоне ведет на дефолтное значение. Как быть? Стоит 3 версия Джанги, запускаю на локальном сервере.

models.py
class Post(models.Model):
    title = models.CharField(max_length=150, db_index=True, verbose_name='Заголовок')
    slug = models.SlugField(max_length=150, blank=True, unique=True, verbose_name='УРЛ')
    body = MarkdownxField(blank=True, db_index=True, verbose_name='Текст')
    tags = models.ManyToManyField('Tag', blank=True, related_name='posts', verbose_name='Теги')
    og_image = models.ImageField(upload_to='og_images',
                                 default="og_images/default.jpg",
                                 verbose_name='Картинка для соцсетей')
    allow_comments = models.BooleanField(default=True, verbose_name='Открытые комментарии')
    date_pub = models.DateTimeField(auto_now_add=True)


settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'


views.py
class PostCreate(LoginRequiredMixin, View):
    model_form = PostForm
    template = 'blog/post_create_form.html'
    raise_exception = True

    def get(self, request):
        form = self.model_form()
        return render(request, self.template, context={'form': form})

    def post(self, request):
        bound_form = self.model_form(request.POST)

        if bound_form.is_valid():
            new_obj = bound_form.save()
            return redirect(new_obj)
        return render(request, self.template, context={'form': bound_form})


forms.py
class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'slug', 'body', 'tags', 'og_image', 'allow_comments']

        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'slug': forms.TextInput(attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'class': 'form-control'}),
            'tags': forms.SelectMultiple(attrs={'class': 'form-control'}),
            'og_image': forms.FileInput(attrs={'class': 'form-control-file'}),
            'allow_comments': forms.CheckboxInput(attrs={'class': 'form-check-input position-static'})
        }


Форма создания поста
<form class="edit-form" action="{% url 'post_create_url' %}" method="post">
        <h1>Новый пост</h1>
        {% csrf_token %}
        {% for field in form %}
            <div class="form-group">
                {% if field.errors %}
                    <div class="alert alert-danger">
                        {{ field.errors }}
                    </div>
                {% endif %}
                {{ field.label }}
                {{ field }}
            </div>
        {% endfor %}
        <button type="submit" name="button" class="btn btn-primary">Создать</button>
    </form>
    {{ form.media }}


В шаблоне ссылку с картинкой хочу подставить сюда
<meta property="og:image" content="{{ post.og_image.url }}">
<meta name="twitter:image:src" content="{{ post.og_image.url }}">
  • Вопрос задан
  • 272 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы