首页 > 解决方案 > 如何在 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

标签: djangodjango-formsdjango-templates

解决方案


有几种方法可以做到这一点。

基本上,如果您确定未使用隐藏字段,则可以使用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

推荐阅读