ModelForm 如果为空则禁用 imageField

ModelForm disable imageField if empty

我有一个允许用户上传图片的表单。如果他们不上传图片,则会显示默认图片。我希望如果他们不上传图像,图像字段将被禁用。我认为表单末尾的 if 语句会起作用——但它没有起作用。这是 forms.py:

的形式
class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'description', 'url', 'product_type', 'price', 'image', 'image_url']
        labels = {
            'name': 'Product Name',
            'url': 'Product URL',
            'product_type': 'Product Type',
            'description': 'Product Description',
            'image': 'Product Image',
            'image_url': 'Product Image URL',
            'price': 'Product Price'
        }
        widgets = {
            'description': Textarea(attrs={'rows': 5}),
        }

    if Product.image is None:
        form.fields['image'].disabled = True

这里是 models.py:

class Product(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=300)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    url = models.CharField(max_length=200)
    product_type = models.CharField(max_length=100)
    image = models.ImageField(upload_to='product_images', default='product_images/default.png', null=True)
    image_url = models.CharField(max_length=200, blank=True)
    likes = models.IntegerField(default=0)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('index', kwargs={})

我尝试删除默认值='product_images/default.png' - 似乎没有用。我试过 null=True ,这似乎使页面崩溃了。我错过了什么?

这是相关的部分模板:

{% if product.image.url %}
    {% if product.image_url %}
        <img class="img-fluid" src="{{ product.image_url }}" />
    {% endif %}
    <img class="img-fluid" src="{{ product.image.url }}" />
{% endif %}

这显示了两种类型的图像 - 上传到本地,link 上传到外部。我要解决的问题是默认图像出现在外部图像下方 - 我想隐藏默认图像。我很早就开始学习 Django 和 Python,所以如果我把事情搞混了,我深表歉意。

您可以在 Form__init__() 方法中更改字段:

class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name', 'description', 'url', 'product_type', 'price', 'image', 'image_url']
        labels = {
            'name': 'Product Name',
            'url': 'Product URL',
            'product_type': 'Product Type',
            'description': 'Product Description',
            'image': 'Product Image',
            'image_url': 'Product Image URL',
            'price': 'Product Price'
        }
        widgets = {
            'description': Textarea(attrs={'rows': 5}),
        }

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        if self.instance:
            # If the instance has no image, they haven't uploaded anything
            if self.instance.image is None:
                # Alter the field in the form
                self.fields['image'].disabled = True

你必须小心你所引用的内容。例如,Product.image 将为您提供 Product class 上的属性,而不是 None,因为您已将其分配给 models.ImageField()。您想要引用 Product 实例 ,这是您可以从 ModelForm().instance 获得的。

我认为您想要的不是禁用表单中的 ImageField。只需尝试为模型中的图像字段设置 blank=True 并删除 default 参数。

# models.py
class Product(models.Model):
    ...
    image = models.ImageField(upload_to='product_images', blank=True, null=True)
    # image_url = models.CharField(max_length=200, blank=True)  # Remove this field, you don't need it.
    ...

此外,从模型和表单中删除 image_url

然后在模板中输入如下内容:

{% if product.image %}
    <img class="img-fluid" src="{{ product.image.url }}" />
{% else %}
    <img class="img-fluid" src="/media/product_images/default.png" />
{% endif %}