django - 如何在 django 表单中禁用表单输入字段的呈现
问题描述
我有以下表格。我让 Django 在我的模板中自动为我呈现表单:{{ form.as_p() }}
. 正如您所看到的,我有公司字段,但是,它是多余的,因为我通过 clean_company 设置公司。公司字段是隐藏的,但我希望它在模板中完全消失。我仍然需要它的形式,因为我希望能够调用:form.save(commit=True)
。
有没有办法从我的模板中取出隐藏字段?
class PlantPurchaseForm(forms.ModelForm):
company = forms.CharField(initial="", widget=forms.HiddenInput())
number = forms.IntegerField(initial=10000, min_value=10000, max_value=99999)
date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"}))
class Meta:
model = PlantPurchase
fields = (
"company",
"number",
"date",
"plant",
"costs",
)
def __init__(self, company, *args, **kwargs):
self.company = company
super(PlantPurchaseForm, self).__init__(*args, **kwargs)
def clean_company(self):
data = self.cleaned_data["company"]
data = self.company
return data
def clean_date(self):
data = self.cleaned_data["date"]
data = datetime.combine(data, time(hour=12))
data = pytz.utc.localize(data)
return data
PlantPurchase 模型:
class PlantPurchase(models.Model):
company = models.ForeignKey(Company, related_name="plant_purchases")
number = models.PositiveSmallIntegerField(unique=True, validators=[MinValueValidator(10000),
MaxValueValidator(99999)])
date = models.DateTimeField()
plant = models.ForeignKey(Plant, related_name="plant_purchase", on_delete=models.PROTECT)
costs = models.DecimalField(max_digits=8, decimal_places=2)
class Meta:
unique_together = ("company", "number")
def __str__(self):
text = "Purchase: #{} {}".format(self.number, self.plant)
return text
解决方案
有几种方法可以做到这一点。
基本上,如果您确定未使用隐藏字段,则可以使用exlude从表单中删除它。您也可以删除 init 方法。
class PlantPurchaseForm(forms.ModelForm):
number = forms.IntegerField(initial=10000, min_value=10000, max_value=99999)
date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"}))
class Meta:
model = PlantPurchase
fields = [
'company',
'number',
'date',
'plant',
'costs',
]
exclude = ["company"]
之后,您需要将公司保存到模型实例中。您可以在验证表单后保存它:
def post(self, request):
...
if form.is_valid():
plantPurchase = form.save()
plantPurchase.company = company
plantPurchase.save()
...
..或将公司传递到表单的保存方法中:
def save(self, company, force_insert=False, force_update=False, commit=False):
purchase = super(PlantPurchaseForm, self).save(commit=commit)
purchase.company = company
purchase.save()
return purchase
推荐阅读
- ios - WKWebView 不触发方法 createWebViewWithConfiguration
- database - Azure Database for PostgreSQL 的匿名化/数据屏蔽
- sql-server - MS SQL Server:暂时禁用索引,但保持更新以便快速重新启用
- c# - 转换 XML 文件时出现“禁止 DTD”异常
- python - 如何在 django 中实现验证字段?
- python - 使用python仅根据主题下载电子邮件附件
- angular - 组件在 .scss 文件中找不到变量
- google-api - 如何将谷歌驱动器视频导入同一个 youtube 帐户?
- java - Eclipse - 在类路径中找不到任何 META-INF/persistence.xml 文件
- javascript - 使用 Link 传递道具时 this.props.location 未定义