首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法赋值“”1“”:"dropdown.drp1“必须是"basedrop”实例

无法赋值“”1“”:"dropdown.drp1“必须是"basedrop”实例
EN

Stack Overflow用户
提问于 2019-11-05 18:18:49
回答 1查看 81关注 0票数 0

我是django的新手,我知道在stackoverflow上也发布过类似的错误,但仍然不能理解我的代码中缺少了什么。我把我所有的代码都包括在下面。

models.py

代码语言:javascript
运行
复制
class basedrop(models.Model):
    name = models.CharField(max_length=50,blank=False,null=False)

    def __str__(self):
        return self.name

class subdrop(models.Model):
    name = models.CharField(max_length=100,blank=False,null=False)
    bsdrop = models.ForeignKey(basedrop,null=False,blank=False,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class lastdrop(models.Model):
    name = models.CharField(max_length=100,blank=False,null=False)
    sbdrop = models.ForeignKey(subdrop,null=False,blank=False,on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class dropdown(models.Model):
    name = models.CharField(max_length=50,blank=False,null=False)
    drp1 = models.ForeignKey(basedrop,on_delete=models.CASCADE)
    drp2 = models.ForeignKey(subdrop,on_delete=models.CASCADE)
    drp3 = models.ForeignKey(lastdrop,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

forms.py

代码语言:javascript
运行
复制
class dropdownForm(forms.ModelForm):
    bdrop_choices = [('---------','---------')]
    bdrop_choices.extend([(bs.get('id'),bs.get('name')) for bs in basedrop.objects.all().values('id','name')])
    drp1 = forms.ChoiceField(choices=bdrop_choices)
    class Meta:
        model = dropdown
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['drp2'].queryset = subdrop.objects.none()
        self.fields['drp3'].queryset = lastdrop.objects.none()
        self.fields['name'].required = True

        if 'drp1' in self.data:
            try:
                country_id = int(self.data.get('drp1'))
                self.fields['drp2'].queryset = subdrop.objects.filter(id=country_id).order_by('name')
            except (ValueError, TypeError):
                pass
        elif 'drp2' in self.data:
            try:
                country_id = int(self.data.get('drp2'))
                self.fields['drp3'].queryset = lastdrop.objects.filter(id=country_id).order_by('name')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['drp2'].queryset = self.instance.drp1.city_set.order_by('name')
            self.fields['drp3'].queryset = self.instance.drp2.city_set.order_by('name')

views.py

代码语言:javascript
运行
复制
def create_drop(request):
    if request.method == 'POST':
        form = dropdownForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponse('<p>this is working</p>')
    form = dropdownForm()
    return render(request,'drop.html',{'form':form})

def load_subdrop(request):
    drp1_id = request.GET.get('drp1')
    subd = basedrop.objects.filter(id=int(drp1_id))
    data = subdrop.objects.filter(bsdrop_id__in=Subquery(subd.values('id'))).order_by('name')
    return render(request, 'dropdownvalue.html', {'dropmenu': data})

def load_lastdrop(request):
    drp1_id = request.GET.get('drp2')
    subd = subdrop.objects.filter(id=int(drp1_id))
    data = lastdrop.objects.filter(sbdrop_id__in=Subquery(subd.values('id'))).order_by('name')
    return render(request, 'dropdownvalue.html', {'dropmenu': data})

drop.html

代码语言:javascript
运行
复制
<!DOCTYPE html>
<html>
<body>
    <form method="post" id="firstdrop" last_drop_list="{% url 'last_drop' %}" data-cities-url="{% url 'first_drop' %}" novalidate>
    {% csrf_token %}
    <table>
            {{form.as_table}}

    </table>
    <button type="submit" id="datasub">Save</button>
  </form>
<div id="errordiv"></div>
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <script>
  $(document).ready(function (){
  $("#datasub").attr("disabled", true);
  });
  $("#id_name").change(function () {
  var vl = $("#id_name").val().replace(/ /g,"")

  if (vl == ''){
  document.getElementById("errordiv").innerHTML="please provide valid input"
  $("#datasub").attr("disabled", true);
  }
  else{
   $("#datasub").attr("disabled", false);
   document.getElementById("errordiv").innerHTML=""
   }

  });

    $("#id_drp1").change(function () {
      var url = $("#firstdrop").attr("data-cities-url");
      var countryId = $(this).val();
      $.ajax({
        url: url,
        data: {
          'drp1': countryId
        },
        success: function (data) {
          $("#id_drp2").html(data);
        }
      });

    });

    $("#id_drp2").change(function () {
      var url = $("#firstdrop").attr("last_drop_list");
      var countryId = $(this).val();
      console.log(countryId)
      $.ajax({
        url: url,
        data: {
          'drp2': countryId
        },
        success: function (data) {
          $("#id_drp3").html(data);
        }
      });

    });
  </script>

  {{form.errors}}
</body>
</html>

错误快照

代码语言:javascript
运行
复制
Internal Server Error: /drop/create/
Traceback (most recent call last):
  File "/home/amol/.local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/amol/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/amol/.local/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/amol/Downloads/dependent-dropdown-example-master/lkdrp/views.py", line 14, in create_drop
    if form.is_valid():
  File "/home/amol/.local/lib/python3.6/site-packages/django/forms/forms.py", line 185, in is_valid
    return self.is_bound and not self.errors
  File "/home/amol/.local/lib/python3.6/site-packages/django/forms/forms.py", line 180, in errors
    self.full_clean()
  File "/home/amol/.local/lib/python3.6/site-packages/django/forms/forms.py", line 383, in full_clean
    self._post_clean()
  File "/home/amol/.local/lib/python3.6/site-packages/django/forms/models.py", line 398, in _post_clean
    self.instance = construct_instance(self, self.instance, opts.fields, opts.exclude)
  File "/home/amol/.local/lib/python3.6/site-packages/django/forms/models.py", line 60, in construct_instance
    f.save_form_data(instance, cleaned_data[f.name])
  File "/home/amol/.local/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 855, in save_form_data
    setattr(instance, self.name, data)
  File "/home/amol/.local/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 211, in __set__
    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "'1'": "dropdown.drp1" must be a "basedrop" instance.
[05/Nov/2019 11:12:57] "POST /drop/create/ HTTP/1.1" 500 100854

我不知道代码出了什么问题,但我的直觉告诉我forms.py出了问题

EN

回答 1

Stack Overflow用户

发布于 2019-11-05 19:20:25

我怀疑您需要使用forms.ModelChoiceField而不是forms.ChoiceField,并相应地调整您的代码。

这对你有效吗?

或者,您可以在表单定义中省略这些字段,django将默认使用ModelChoiceField。它可能看起来像这样:

代码语言:javascript
运行
复制
class dropdownForm(forms.ModelForm):
    class Meta:
        model = dropdown
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['drp2'].queryset = subdrop.objects.none()
        self.fields['drp3'].queryset = lastdrop.objects.none()

        if 'drp1' in self.data:
            try:
                country_id = int(self.data.get('drp1', ''))
                self.fields['drp2'].queryset = subdrop.objects.filter(id=country_id).order_by('name')
            except ValueError:
                pass
        elif 'drp2' in self.data:
            try:
                country_id = int(self.data.get('drp2', ''))
                self.fields['drp3'].queryset = lastdrop.objects.filter(id=country_id).order_by('name')
            except ValueError:
                pass
        elif self.instance.pk:
            self.fields['drp2'].queryset = self.instance.drp1.city_set.order_by('name')
            self.fields['drp3'].queryset = self.instance.drp2.city_set.order_by('name')

这对你有效吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58709191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档