python - ModelForm 如果为空则禁用 imageField

标签 python django image modelform

我有一个允许用户上传图像的表单。如果他们不上传图像,则会显示默认图像。我希望如果他们不上传图像,图像字段将被禁用。我以为表单末尾的 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={})

我尝试删除 default='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 %}

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

最佳答案

我认为你想要的不是禁用表单中的 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 %}

关于python - ModelForm 如果为空则禁用 imageField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47001484/

相关文章:

python - 游程编码图像

javascript - 如何在表格行中填充图像?

python - 使用批处理文件在 python 中获取用户输入

javascript - CSS/JS - 删除一个 li 元素的动画链接下划线

python - 如何使用 EPD python 让 FEniCS 在 Ubuntu 12.04 中工作?

python - Django 独特的外键组合

mysql - 如何为 heroku 配置开发和部署数据库?

html - 在 CSS 中定位背景图像

python - 使用 Python pdfMiner 每页提取文本?

python - 如何在 Windows 上使用 Python 3 连接到 MySQL?