не в состоянии сохранять данные в форме Django - PullRequest
0 голосов
/ 16 октября 2019

Я получаю сообщение об ошибке Невозможно назначить «1»: «dropdown.drp1» должен быть экземпляром «basedrop». Я делюсь своим кодом. Пожалуйста, помогите. Я получил некоторые решения в стеке, но я не понимал, как реализовать это в моем случае. Ошибка Джанго. Невозможно назначить экземпляр

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)
    drp1 = models.ForeignKey(basedrop,max_length=50,on_delete=models.CASCADE)
    drp2 = models.ForeignKey(subdrop,max_length=50,on_delete=models.CASCADE)
    drp3 = models.ForeignKey(lastdrop,max_length=50,on_delete=models.CASCADE)


    def __str__(self):
        return self.name

views.py

def create_drop(request):
    if request.method == 'POST':
        form = dropdownForm(request.POST or None)
        if form.is_valid():
            form = dropdown(name=request.POST.get('name'),drp1_Id=int(request.POST.get('drp1')),
                drp2_Id=int(request.POST.get('drp2')),drp3_Id=int(request.POST.get('drp3')))
            form.save()
            return HttpResponse('<p>this is working</p>')
    form = dropdownForm()
    return render(request,'drop.html',{'form':form})

forms.py

class dropdownForm(forms.ModelForm):

drp1 = forms.ChoiceField(choices=((bs.get('id'),bs.get('name')) for bs in basedrop.objects.all().values('id','name')))
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, 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')

1 Ответ

0 голосов
/ 16 октября 2019

Я не знаю, может ли это привести к сбоям, но вы передаете POST-аргумент 'drp1' в виде целого числа для drp1_Id, drp2_Id и drp3_Id.


У вас было бы намного проще, если быВы выбираете более интуитивно понятный стиль кодирования.

Например, эта строка:

form = dropdown(name=request.POST.get('name'), drp1_Id=int(request.POST.get('drp1')), drp2_Id=int(request.POST.get('drp1')), drp3_Id=int(request.POST.get('drp1')))

Если вы получаете объекты и передаете их в раскрывающийся список, вы получаете удобочитаемость, особенно при возникновении ошибки:

drp1_pk = request.POST.get('drp1')
drp1 = basedrop.objects.get(pk=drp1_pk)
drp2 = subdrop.objects.get(pk=drp1_pk)
drp3 = lastdrop.objects.get(pk=drp1_pk)
form = dropdown(name=request.POST.get('name'), drp1=drp1, drp2=drp2, drp3=drp3)

Но опять же: выглядит странным передавать один и тот же первичный ключ трем различным моделям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...