Python 无法分配"';1'&引用;:&引用;下拉列表.drp1“;必须是一个";“basedrop”;实例

Python 无法分配"';1'&引用;:&引用;下拉列表.drp1“;必须是一个";“basedrop”;实例,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我是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

我是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,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

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, 'dropdownvalue.html', {'dropmenu': data})
我不知道代码有什么问题,但我的直觉告诉我表单有问题。py

我怀疑您需要使用而不是
表单。选择字段
,并相应地调整表单代码

这对你有用吗


或者您可以从表单定义中省略这些字段,django将根据默认值使用
modelcooicefield
。它可能是这样的:

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')

这对你有用吗?

外键中,
最大长度选项没有意义(
models.ForeignKey(basedrop,max_length=50,on_delete=models.CASCADE)
)请添加完整的错误堆栈跟踪;它包含有关error@Ralf我已经添加了错误片段,请检查。我还注意到,当我打印self.cleaned_数据时,它只显示两个字段“name”和“drp1”,而不显示“drp2”和“drp3”。你能帮助我在forms.py中进行更改吗?我在代码drp1=forms.modelcoocefield中添加了这3行(queryset=basedrop.objects.all())drp2=forms.ModelChoiceField(queryset=subdrop.objects.none())drp3=forms.ModelChoiceField(queryset=lastdrop.objects.none())我没有收到任何错误,但它不工作,因为它没有解决我的问题。单击按钮,它会显示空白的表单,并且没有任何错误
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
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')