ModelForm禁用imageField如果为空

时间:2017-10-29 14:43:08

标签: python django image modelform

我有一个允许用户上传图片的表单。如果他们没有上传图片,则会显示默认图片。我希望如果他们不上传图片,则禁用图片字段。我认为表格末尾的if语句可行 - 但它没有。这是form.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 %}

这显示了两种类型的图像 - 上传到本地,并链接到外部。我试图解决的问题是默认图像出现在外部图像下方 - 我想隐藏默认图像。我很早就学习了Django和Python,所以如果我搞砸了,我会道歉。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

您可以使用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类的属性,该属性不是None,因为您已将其分配为models.ImageField()。您想引用Product实例,这是您可以从ModelForm().instance获得的内容。