不在 django 中以表单形式提交图像

问题描述 投票:0回答:1

更准确的说法是,图片名称发送了,但没有任何变化。我有一个用户模型。用户有自己的头像(ImageField)。我已经写了一个表格并将所有内容都放在模板中。提交表单时,除了图像之外的所有内容都会被保存。但是当更改管理员时一切都很好。为什么?帮助我,请已经尝试过一切都没有帮助!!!!

设置.py:

`MEDIA_ROOT = BASE_DIR / "media"`

models.py:

class Women(models.Model):
    class Status(models.IntegerChoices):
        DRAFT = 0, 'Черновик'
        PUBLISHED = 1, 'Опубликовано'

    title = models.CharField(max_length=255, verbose_name="Заголовок")
    slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name="Slug",                           validators=[
                               MinLengthValidator(5, message="Минимум 5 символов"),
                               MaxLengthValidator(100, message="Максимум 100 символов"),
                           ])
    photo = models.ImageField(upload_to="photos",default=None,blank=True,null=True,verbose_name="Фото")
    content = models.TextField(blank=True, verbose_name="Текст статьи")
    time_create = models.DateTimeField(auto_now_add=True, verbose_name="Время создания")
    time_update = models.DateTimeField(auto_now=True, verbose_name="Время изменения")
    is_published = models.BooleanField(choices=tuple(map(lambda x: (bool(x[0]), x[1]), Status.choices)),
                                       default=Status.DRAFT, verbose_name="Статус")
    cat = models.ForeignKey('Category', on_delete=models.PROTECT, related_name='posts', verbose_name="Категории")
    tags = models.ManyToManyField('TagPost', blank=True, related_name='tags', verbose_name="Теги")
    husband = models.OneToOneField('Husband', on_delete=models.SET_NULL,
                                   null=True, blank=True, related_name='wuman', verbose_name="Муж")

    objects = models.Manager()
    published = PublishedManager()

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "Известные женщины"
        verbose_name_plural = "Известные женщины"
        ordering = ['-time_create']
        indexes = [
            models.Index(fields=['-time_create'])
        ]

    def get_absolute_url(self):

forms.py:

class AddPostForm(forms.ModelForm):
    cat = forms.ModelChoiceField(queryset=Category.objects.all(), empty_label="Категория не выбрана", label="Категории")
    husband = forms.ModelChoiceField(queryset=Husband.objects.all(), empty_label="Не замужем", required=False, label="Муж")

    class Meta:
        model = Women
        fields = ['title', 'slug', 'content', 'photo','is_published', 'cat', 'husband', 'tags']
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-input'}),
            'content': forms.Textarea(attrs={'cols': 50, 'rows': 5}),
        }
        labels = {'slug': 'URL'}

    def clean_title(self):
        title = self.cleaned_data['title']
        if len(title) > 50:
            raise ValidationError("Длина превышает 50 символов")

        return title

views.py:

def addpage(request):
    if request.method == 'POST':
        form = AddPostForm(request.POST, request.FILES)
        if form.is_valid():
       
            form.save()
            return redirect("home")
    else:
        form = AddPostForm()

    data = {
        'menu': menu,
        'title': 'Добавление статьи',
        'form': form
    }
    return render(request, 'women/addpage.html', data)

html:

{% block content %}
<h1>{{title}}</h1>
<form action="" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <div class="form-error">{{ form.non_field_errors }}</div>
    {% for f in form %}
    <p><label class="form-label" for="{{ f.id_for_label }}">{{ f.label }}</label>{{ f }}</p>
    <div class="form-error">{{ f.errors }}</div>
    {% endfor %}
    <p><button type="submit">Отправить</button></p>
</form>
{% endblock %}

我不知道该怎么办

python django deployment backend
1个回答
0
投票

将此

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
替换为您的
settings.py

中的 MEDIA_ROOT

import os
如果还没有的话。

在您的

urls.py
中,您没有包含媒体文件的服务。 将其添加到您的
urls.py
文件的末尾

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.