Django - 根据用户在另一个字段中输入的内容填写一个字段

问题描述 投票:0回答:1

我试图根据用户在另一个字段中输入的内容自动填充一个字段。您将在下面看到一个名为“typeofacct”的 Choice 字段,还有另一个名为“mintoopen”的字段。 “typeofacct”的选项之一是日常业务,还有其他 4 个选项。例如,如果用户选择日常业务作为“typeofacct”字段的选项,我希望“mintoopen”字段填写“$100”(字符串)。以下是我的文件:

forms.py

class WaiveForm(forms.Form):


    header = forms.CharField(
        widget=HeaderWidget(attrs={'class': 'my-css-class'}),
        initial='Fee Waive Worksheet',
        required=False,
        label=''
    )

    businessname = forms.CharField(max_length=50, label='Business Name')
    acctnum = forms.IntegerField(label='Business Account Number')
    annualreviewdt = forms.DateField(label='Annual Review Date', initial=(today + relativedelta(years=1)).strftime('%m/%d/%Y'), disabled=True, required=False)
    effectivemonth = forms.ChoiceField(choices=effectiveMonthChoice, label='Effective Month')
    typeofacct = forms.ChoiceField(choices=typeOfAcctChoice, label='Type of Account')

    # Table
    mintoopen = forms.ChoiceField(required=False, choices=minToOpenOptions)


class SnippetForm(forms.ModelForm):

    class Meta:
        model = Snippet
        fields = ('businessname', 'acctnum', 'annualreviewdt', 'effectivemonth', 'typeofacct', 'mintoopen')


模型.py

class Snippet(models.Model):

    businessname = models.CharField(max_length=50)
    #acctNum = models.IntegerField(max_length=17)
    acctnum = models.PositiveIntegerField(primary_key=True, validators=[MaxValueValidator(99999999999999999)])
    annualreviewdt = models.DateTimeField(default=today)
    effectivemonth = models.CharField(choices=effectiveMonthChoice, max_length=2)
    typeofacct = models.CharField(choices=typeOfAcctChoice, max_length=1)


    # Table
    mintoopen = models.CharField(max_length=20, blank=True, choices=minToOpenOptions, default=typeofacct.formfield())



    def __str__(self):
        return self.businessname, self.acctnum, self.annualreviewdt, self.effectivemonth, self.typeofacct, self.mintoopen



    def mintoopen_func(self):
        return minToOpenArray[int(self.typeofacct)]


    def save(self, *args, **kwargs):
        if not self.mintoopen:
            self.mintoopen = self.mintoopen_func()
        super(Snippet, self).save(*args, **kwargs)

views.py

def waive(request):

    if request.method == 'POST':
        form = WaiveForm(request.POST)
        if form.is_valid():

            businessname = form.cleaned_data['businessname']
            acctnum = form.cleaned_data['acctnum']
            annualreviewdt = form.cleaned_data['annualreviewdt']
            effectivemonth = form.cleaned_data['effectivemonth']
            typeofacct = form.cleaned_data['typeofacct']


            #mintoopen = form.cleaned_data['mintoopen']
            mintoopen = minToOpenArray[int(form.cleaned_data['typeofacct'])]




            print('Business Name: ', businessname,
                  '\nBusiness Account Number: ', acctnum,
                  '\nAnnual Review Date: ', annualreviewdt.strftime('%m/%d/%Y'),
                  '\nEffective Month: ', effectivemonth,
                  '\nType of Account: ', typeofacct,
                  '\nMin to Open: ', mintoopen)

    form = WaiveForm()
    return render(request, 'forms.html', {'form': form})


def snippet_detail(request):

    if request.method == 'POST':
        form = SnippetForm(request.POST)
        if form.is_valid():
            form2 = form.save(commit=False)


            form.save()


    form = SnippetForm()
    return render(request, 'forms.html', {'form': form})

正如您在 models.py 中看到的,我尝试重写 save() 方法,但我不确定如何实现它。我也尝试使用 save(commit=False)。再次,我希望将表单设置如下,除非选择日常业务(或其他选项)时,“mintoopen”字段会自动填写相应的值。

enter image description here

python django django-models django-views django-forms
1个回答
0
投票

要根据

mintoopen
字段中的选择自动填充
typofacct
字段,您可以在模板中使用 JavaScript/jQurey,这样您的模板应如下所示:

<!-- include jQuery library -->
<script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>

<form method="post" action="{% url 'waive' %}" id="waiveForm">
  {% csrf_token %}
  {{ form.as_p }}

  <script>
    // define a mapping of typeofacct values to corresponding mintoopen values
    var minToOpenMapping = {
      '1': '$100',
      '2': '$200',
      // add more mappings as needed
    };

    // function to update mintoopen based on typeofacct selection
    function updateMintoOpen() {
      var typeofacctValue = $('#id_typeofacct').val();
      var mintoopenValue = minToOpenMapping[typeofacctValue];

      // Set the value of the mintoopen field
      $('#id_mintoopen').val(mintoopenValue);
    }

    // attach the updateMintoOpen function to the change event of typeofacct field
    $('#id_typeofacct').change(updateMintoOpen);

    // trigger the initial update to set mintoopen based on the initial value of typeofacct
    updateMintoOpen();
  </script>

  <input type="submit" value="Submit">
</form>

希望对你有帮助

© www.soinside.com 2019 - 2024. All rights reserved.