图像不是通过模型表单上传到django中,而是从管理面板添加

图像不是通过模型表单上传到django中,而是从管理面板添加,django,django-models,django-views,django-forms,Django,Django Models,Django Views,Django Forms,因此,在我的django项目中,我有一个页面,用户可以通过表单填写有关其个人资料的详细信息 表格如下: class VendorProfileForm(ModelForm): class Meta: model = Vendor fields = ['name', 'address', 'pincode', 'phone', 'email', 'image1', 'image2', 'image3', 'image4'] class Vendor(mod

因此,在我的django项目中,我有一个页面,用户可以通过表单填写有关其个人资料的详细信息

表格如下:

class VendorProfileForm(ModelForm):
    class Meta:
        model = Vendor
        fields = ['name', 'address', 'pincode', 'phone', 'email', 'image1', 'image2', 'image3', 'image4']
class Vendor(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField(blank=True, null=True)
    pincode = models.IntegerField(blank=True, null=True)
    phone = models.CharField(blank=True, null=True, max_length=20)
    address = models.CharField(blank=True, null=True, max_length=200)
    image1 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    image2 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    image3 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    image4 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    created_by = models.OneToOneField(User, related_name='vendor', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
表格所指的“供应商”模型如下:

class VendorProfileForm(ModelForm):
    class Meta:
        model = Vendor
        fields = ['name', 'address', 'pincode', 'phone', 'email', 'image1', 'image2', 'image3', 'image4']
class Vendor(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField(blank=True, null=True)
    pincode = models.IntegerField(blank=True, null=True)
    phone = models.CharField(blank=True, null=True, max_length=20)
    address = models.CharField(blank=True, null=True, max_length=200)
    image1 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    image2 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    image3 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    image4 = models.ImageField(upload_to='shop_images/', blank=True, null=True)
    created_by = models.OneToOneField(User, related_name='vendor', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
使用的视图如下所示:

@login_required
    def vendor_profile_details(request):
        if request.method == 'POST':
            form = VendorProfileForm(request.POST)
    
            if form.is_valid():
                vendor = form.save(commit=False)
                vendor.created_by = request.user
                vendor.save()
                return redirect('vendor_admin')
        else:
            form = VendorProfileForm()
    
        return render(request, 'vendor_profile_details.html', {'form': form})
{% extends 'base.html' %}

{% block title %}Profile details | {% endblock %}

{% block content %}
    <h1 class="title">Finish your profile</h1>

    <form method="post" action="." method = "post" enctype="multipart/form-data">
        {% csrf_token %}

        {{ form.as_p }}

        <div class="field">
            <div class="control">
                <button class="button is-dark is-uppercase" type="submit">Save</button>
            </div>
        </div>
    </form>

    <hr>

{% endblock %}
前端部件“vendor_profile_details.html”使用的模板如下:

@login_required
    def vendor_profile_details(request):
        if request.method == 'POST':
            form = VendorProfileForm(request.POST)
    
            if form.is_valid():
                vendor = form.save(commit=False)
                vendor.created_by = request.user
                vendor.save()
                return redirect('vendor_admin')
        else:
            form = VendorProfileForm()
    
        return render(request, 'vendor_profile_details.html', {'form': form})
{% extends 'base.html' %}

{% block title %}Profile details | {% endblock %}

{% block content %}
    <h1 class="title">Finish your profile</h1>

    <form method="post" action="." method = "post" enctype="multipart/form-data">
        {% csrf_token %}

        {{ form.as_p }}

        <div class="field">
            <div class="control">
                <button class="button is-dark is-uppercase" type="submit">Save</button>
            </div>
        </div>
    </form>

    <hr>

{% endblock %}
我已在settings.py文件中正确定义了媒体文件夹

MEDIA_URL = '/media/'

MEDIA_ROOT = BASE_DIR/'media/'
尽管这样做了,我的图像并没有通过表单上传到媒体文件夹。 但是,当我进入管理面板并直接从那里添加图像时,图像会成功上传到媒体文件夹中。为什么会出现此问题?

您还需要为表单提供参数:

    if request.method == 'POST':
        form = VendorProfileForm(request.POST, request.FILES)

实际上,您通常会指定request.FILES作为 文件数据(就像使用request.POST作为表单数据源一样):