Python 无法分配"';1'&引用;:&引用;下拉列表.drp1“;必须是一个";“basedrop”;实例
我是django的新手,我知道stackoverflow上也出现过类似类型的错误,但我仍然无法理解我的代码中缺少了什么。我在这个问题上陷入了一段时间。我把我所有的代码都写在下面 models.pyPython 无法分配"';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
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')