【问题标题】:DJANGO - How to display a text form field next to checked checkboxesDJANGO - 如何在选中的复选框旁边显示文本表单字段
【发布时间】:2020-06-06 07:03:34
【问题描述】:

我正在创建一个允许您将预定义服务添加到发票的应用程序。创建新发票时,您可以使用复选框选择服务。我想在选中复选框后添加文本字段以指定数量。因此,您选中复选框,旁边会出现文本字段,您可以在其中输入数量。创建新发票后,我想将此数据存储在数据库中。我不确定如何实现这一目标。我需要 JS 还是只有 Django 就够了?

更新 7.06.2020 模型.py

class Service(models.Model):
    nazwa = models.CharField(max_length=100)
    cena = models.FloatField()

    def __str__(self):
        return f'{self.nazwa} - cena: {self.cena}zł'

class ServiceItem(models.Model):
    usluga = models.ForeignKey(Service, on_delete=models.CASCADE)
    ilosc = models.PositiveIntegerField(default=1)

    def __str__(self):
        return f'{self.usluga.nazwa} - cena: {self.usluga.cena}zł'

class Invoice(models.Model):
    forma_platnosci_wybor = [
        ('przelew', 'przelew'),
        ('gotowka', 'gotówka')
    ]

    numer = models.CharField(max_length=30)
    firma = models.ForeignKey(Company, on_delete=models.CASCADE)
    forma_platnosci = models.CharField(verbose_name='forma płatności', max_length=75, choices=forma_platnosci_wybor)
    data_badania = models.DateField()
    data_wystawienia_faktury = models.DateTimeField()

    rabat = models.IntegerField(verbose_name='rabat [%]', blank=True, null=True)
    uslugi = models.ManyToManyField(ServiceItem, blank=True, null=True)

    def __str__(self):
        return self.numer

forms.py

class NewInvoiceForm(forms.ModelForm):

    class Meta:
        model = Invoice
        fields = '__all__'
        exclude = ['numer', 'data_wystawienia_faktury']
        widgets = {
            'usluga' : forms.CheckboxSelectMultiple,
            'data_badania' : DateInput(),
        }

模板表格

<legend class="col-12">Tworzenie nowej faktury</legend>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <fieldset>
        <div class="form-row">
            <div class="col-lg-4">
                {{ form.firma | as_crispy_field}}
            </div>
        </div>
        <div class="form-row">
            <div class="col-lg-2">
                {{ form.forma_platnosci | as_crispy_field}}
            </div>
            <div class="col-lg-2">
                {{ form.data_badania | as_crispy_field}}
            </div>
        </div>
        <div class="form-row">
            <div class="col-lg-4">
                {{ form.rabat | as_crispy_field}}
            </div>
        </div>
        <div class="form-row">
            <div class="col-lg-4">
                {{ form.uslugi | as_crispy_field }}
            </div>
        </div>
    </fieldset>
        <button type="submit" class="btn btn-info"><i class="far fa-edit"></i> Zatwierdź fakturę</button>
    </form>

ScreenShot

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果我理解正确,您希望在表单能够出现之前单击复选框吗?如果是这样的话jsidea就得落实到位

    【讨论】:

      【解决方案2】:

      您需要渲染隐藏的文本字段并使用 JS 使其可见,例如在复选框上使用 onclick 事件。如果这是表单上的一次出现,它可能很简单,如果它是动态生成的复选框和文本字段的多次出现,它可能会有点困难 - 但可行。

      【讨论】:

      • 好的,但是我怎样才能在数据库中存储这些额外的数据?
      • 所以,JS只会处理表单中激活字段的部分,仅此而已。如果您希望存储此字段,那么您将需要与您的两个模型都有关系的附加模式,您可以在其中存储这些附加字段。我会亲自制作内联框架集,用户可以在其中从带有服务的下拉菜单或从 select2 字段中添加额外的行到发票。也许这就是要走的路。这实际上取决于您希望最终拥有多少服务。
      • 所以我希望发票上的服务不超过 5 项,但我想使用多个复选框来选择它们。我创建了另一个模型:ServiceItem(您将在我的第一个消息中找到更新的代码)。有什么方法可以在我的模板 ilosc(quantity) 整数字段中显示?
      • 我尝试过使用 formset。就像: ServiceFormSet = inlineformset_factory(Service, ServiceItem, fields=('ilosc',)) 但是如何为一个复选框位置显示一个字段?目前我在第一篇文章中有类似图片的内容。
      • 很遗憾,我没有看到任何图片。拥有动态添加服务的选项比将所有内容都写在代码中更具可扩展性。当您创建表单集时,每一行都成为自己的表单,因此您可以创建其他表单并在创建 inlineformset_factory 时添加它,并且您可以控制哪些字段是可见的,哪些字段是隐藏的,就像在任何表单中一样。此外,您可以在表格中呈现所有内容,以便您可以选择添加新服务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多