Как я могу отключить рендеринг поля ввода формы в форме Django - PullRequest
0 голосов
/ 06 июля 2018

У меня есть следующая форма. Я позволил 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

Ответы [ 2 ]

0 голосов
/ 12 июля 2018

Я решил свою проблему, обратившись к экземпляру формы в методе 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 = (
            "number",
            "date",
            "plant",
            "costs",
        )

    def __init__(self, company, *args, **kwargs):
        super(PlantPurchaseForm, self).__init__(*args, **kwargs)
        self.instance.company = company

    def clean_date(self):
        data = self.cleaned_data["date"]
        data = datetime.combine(data, time(hour=12))
        data = pytz.utc.localize(data)
        return data
0 голосов
/ 06 июля 2018

Есть несколько способов сделать это.

Обычно, если вы уверены, что скрытое поле не используется, вы можете удалить его из формы с помощью исключить . Вы также можете удалить метод 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
...