【问题标题】:Why django dependent dropdownn is not working为什么依赖 django 的下拉菜单不起作用
【发布时间】:2021-03-29 10:37:42
【问题描述】:

我不知道我的代码哪里有错误。它只是没有按预期工作。 我的意见.py

def load_cities(request):
    year_id = request.GET.get('year')
    terms = Term.objects.filter(school=request.user.school).filter(year_id=year_id).order_by('name')
    return render(request, 'city_dropdown_list_options', {'terms': terms})

我的模型。

class Year(models.Model):
    
    school = models.ForeignKey(School,on_delete=models.CASCADE)
    year = models.CharField(max_length=200,unique=True)

class Term(models.Model):
    school = models.ForeignKey(School,on_delete=models.CASCADE)
    year = models.ForeignKey(Year,on_delete=models.CASCADE)
    name = models.CharField(max_length=200,unique=True) 

class Exam(models.Model):
    school = models.ForeignKey(School,on_delete=models.CASCADE)
    year = models.ForeignKey(Year,on_delete=models.SET_NULL, null=True)
    term = models.ForeignKey(Term,on_delete=models.SET_NULL, null=True)
    name = models.CharField(max_length=20)
    form = models.ManyToManyField(FormModel)

我的表单.py

    class NewExamForm(forms.ModelForm):
        class Meta:
            model = Exam
            fields = ("year","term","name","school","form")
            
            widgets = {
                'school':forms.TextInput(attrs={"class":'form-control','value':'','id':'identifier','type':'hidden'}),
                "year":forms.Select(attrs={"class":'form-control'}),
                "name":forms.TextInput(attrs={"class":'form-control'}),
                "form":forms.Select(attrs={"class":'form-control'}),
                
            }
        def __init__(self, school, *args, **kwargs):
            super(NewExamForm, self).__init__(*args, **kwargs)
            
            
            self.fields['year'] = forms.ModelChoiceField(
                queryset=Year.objects.filter(school=school))
    
            self.fields['term'].queryset = Term.objects.none()
    
            self.fields['form'] = forms.ModelMultipleChoiceField(
                queryset=FormModel.objects.filter(school=school),
                widget=forms.CheckboxSelectMultiple,
                required=True)
            
            if 'year' in self.data:
                try:
                    year = int(self.data.get('year'))
                    self.fields['term'].queryset = Term.objects.filter(school=school).filter(year_id=year).order_by('name')
                except (ValueError, TypeError):
                    pass  # invalid input from the client; ignore and fallback to empty City queryset
            elif self.instance.pk:
                self.fields['term'].queryset = self.instance.year.term_set.order_by('name')

The template

<div class="form-group">
        <form method="post" id="examForm" data-cities-url="{% url 'ajax_load_cities' %}" novalidate enctype="multipart/form-data">
        {% csrf_token %}
        <table>
          {{ form|crispy }}
        </table>
        <button type="submit">Save</button>
        </form>
        
    </div>

我已经尝试过,但它只有在我选择了一年并手动刷新并选择了年份后才有效,这就是条款出现的时候。

我尝试按照 Vitor Freitas 的代码进行操作,但无法正常工作。任何知道如何提供帮助的人。

【问题讨论】:

  • 您包含了 Vitor Freitas 示例中的表单,但您没有包含 jquery 脚本。如果您正确设置了 javascript,它将在 year 下拉列表更改时运行,并发出 ajax 请求以更新 terms 下拉列表。没有它,terms 下拉列表不会改变,除非你刷新它,正如你发现的那样。仔细检查 Vitor 的代码,并对其进行更改以适合您的应用程序。如果您仍有问题,请使用所有代码(包括 javascript)更新您的问题,并描述您遇到的确切问题。

标签: python django django-crispy-forms


【解决方案1】:

我按照@evergreen 的指示对脚本进行了更正,从而使其正常工作。

<script>

$("#id_year").change(function () {
  var url = $("#examForm").attr("term-data");
  var yearId = $(this).val();

  $.ajax({
    url: url,
    data: {
      'year': yearId
    },
    success: function (data) {
      $("#id_term").html(data);
    }
  });

});
  </script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 2020-11-06
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    相关资源
    最近更新 更多