Поле 'id' ожидало число, но получило <QueryDict: {'csrfmiddlewaretoken':

У меня эта ошибка и я не могу решить проблему

VIEW.PY

def projects_add(request, client_id):
    if request.method == 'POST':
        form = ProjectForm(request.POST or None)
        if form.is_valid():
            instance = form.save(commit=False)
            client = Clients.objects.get(pk=client_id)
            instance.client = client
            instance.created_date = datetime.date.today()
            instance.status = 'Análise'
            instance.save()
            messages.success(request,'Projeto adicionado')
        else:
            messages.error(request,'Ocorreu um erro!')
        return HttpResponseRedirect(reverse('projects'))
    else:
        form = ProjectForm(client_id)
        all_projects = Project.objects.all()
    return render(request,'projects.html',{'form':form,
                                            'all_projects':all_projects})

FORMS.PY

class ProjectForm(ModelForm):

    class Meta:
        model = Project
        fields = ['owner','farm','warranty','modal','culture','value','final_date']

    def __init__(self, client_id, *args,**kwargs):
        super(ProjectForm, self).__init__(*args,**kwargs)
        self.fields['value'].required = False
        self.fields['final_date'].required = False
        self.fields['farm'].queryset = Farm.objects.filter(client=client_id)
        self.fields['warranty'].queryset = Farm.objects.filter(client=client_id)
        for field_name, field in self.fields.items():
            field.widget.attrs['class'] = 'form-control'

MODELS.PY

class Project(models.Model):
    modal_types = [('CUSTEIO AGRÍCOLA','Custeio Agrícola'),('CUSTEIO PECUÁRIO','Custeio Pecuário'),('INVESTIMENTO AGRÍCOLA','Investimento Agrícola'),('INVESTIMENTO PECUÁRIO','Investimento Pecuário'),('FGPP','FGPP')]
    farm = models.ManyToManyField(Farm, related_name='project_farm',verbose_name='Propriedade beneficiada')
    client = models.ForeignKey(Clients, on_delete=models.CASCADE, related_name='project_client',default=None,null=True, verbose_name='Cliente')
    owner = models.ForeignKey(Owner, on_delete=models.CASCADE, related_name='project_bidder',default=None,null=True, verbose_name='Proponente')
    warranty = models.ManyToManyField(Farm, related_name='project_warranty',default=None, verbose_name='Propriedade de garantia')
    modal = models.CharField(max_length=100,default=None,choices=modal_types, null=True, verbose_name='Tipo')
    culture = models.CharField(max_length=50,null=True, verbose_name='Cultura')
    status = models.CharField(max_length=50,null=True, verbose_name='Status')
    created_date = models.DateField(null=True, verbose_name='Data de criação')
    value = models.FloatField(max_length=10,null=True, verbose_name='Valor financiado')
    final_date = models.DateField(default=None,null=True, verbose_name='Fim do contrato') 

Я думаю, что проблема возникает из-за способа определения queryset, но я перепробовал все, и это не работает.

Вы сделали client_id первым параметром конструктора ProjectForm, поэтому вам следует создать ProjectForm с:

from django.shortcuts import get_object_or_404, redirect

def projects_add(request, client_id):
    if request.method == 'POST':
        form = ProjectForm(client_id, request.POST, request.FILES)
        if form.is_valid():
            client = get_object_or_404(Clients, pk=client_id)
            form.instance.client = client
            form.instance.created_date = datetime.date.today()
            form.instance.status = 'Análise'
            form.save()
            return redirect('projects')
            messages.success(request,'Projeto adicionado')
        else:
            messages.error(request,'Ocorreu um erro!')
    else:
        form = ProjectForm(client_id)
    all_projects = Project.objects.all()
    return render(request,'projects.html',{'form':form, 'all_projects':all_projects})

Примечание: Часто лучше использовать get_object_or_404(…) [Django-doc], чем использовать .get(…) [Django-doc] напрямую. В случае, если объект не существует, например, потому что пользователь сам изменил URL, get_object_or_404(…) приведет к возврату ответа HTTP 404 Not Found, в то время как использование .get(…) приведет к ответу HTTP 500 Server Error.

Вернуться на верх