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