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