无法分配“'1'”:“ dropdown.drp1”必须是“ basedrop”实例

我是django的新手,我知道在stackoverflow上已经发布了类似的错误类型,但是仍然无法理解我的代码中缺少的内容。我将所有代码都包含在下面。

models.py

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,null=False)
    bsdrop = models.ForeignKey(basedrop,null=False,on_delete=models.CASCADE)

    def __str__(self):
        return self.name

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

    def __str__(self):
        return self.name


class dropdown(models.Model):
    name = models.CharField(max_length=50,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

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

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,{'dropmenu': data})

drop.html

<!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>

错误捕捉

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

我不知道代码有什么问题,但是我的直觉说form.py有问题

ccxygc2008 回答:无法分配“'1'”:“ dropdown.drp1”必须是“ basedrop”实例

我怀疑您需要使用forms.ModelChoiceField而不是timezone并相应地调整表单代码。

对您有用吗?


或者您可以从表单定义中忽略这些字段,并且django将默认使用forms.ChoiceField。看起来可能像这样:

ModelChoiceField

这对您有用吗?

本文链接:https://www.f2er.com/3160500.html

大家都在问