Reputation: 100
I'm having this error and I can't solve the problem
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')
TRACEBACK
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\luizh\Desktop\Novo Sistema\ATR\projects\views.py", line 30, in projects_add form = ProjectForm(request.POST or None) File "C:\Users\luizh\Desktop\Novo Sistema\ATR\projects\forms.py", line 16, in init self.fields['farm'].queryset = Farm.objects.filter(client=client_id) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\query.py", line 974, in filter return self._filter_or_exclude(False, args, kwargs) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\query.py", line 992, in _filter_or_exclude clone._filter_or_exclude_inplace(negate, args, kwargs) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\query.py", line 999, in _filter_or_exclude_inplace self._query.add_q(Q(*args, **kwargs)) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\sql\query.py", line 1375, in add_q clause, _ = self._add_q(q_object, self.used_aliases) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\sql\query.py", line 1396, in add_q child_clause, needed_inner = self.build_filter( File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\sql\query.py", line 1329, in build_filter condition = self.build_lookup(lookups, col, value) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\sql\query.py", line 1180, in build_lookup lookup = lookup_class(lhs, rhs) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\lookups.py", line 22, in init self.rhs = self.get_prep_lookup() File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\fields\related_lookups.py", line 120, in get_prep_lookup self.rhs = target_field.get_prep_value(self.rhs) File "C:\Users\luizh\anaconda3\envs\env\lib\site-packages\django\db\models\fields_init.py", line 1824, in get_prep_value raise e.class( TypeError: Field 'id' expected a number but got <QueryDict: {'csrfmiddlewaretoken': ['ha7mOkHl8SkjuKDx06TipoflYdFFEdZFxT3ST5DdVZYRSGkHSffTOTGWdDXWaWf1'], 'owner': ['1'], 'farm': ['4'], 'warranty': ['4'], 'modal': ['CUSTEIO AGRÍCOLA'], 'culture': ['toamte'], 'value': [''], 'final_date': ['']}>. [23/Feb/2022 11:20:44] "POST /projetos/1 HTTP/1.1" 500 135681
I think the problem occurs because of the way I use to define queryset, but I've tried everything and it doesn't work.
Upvotes: 2
Views: 1010
Reputation: 477533
You made client_id
the first parameter of your ProjectForm
constructor, so you should create the ProjectForm
with:
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})
Note: It is often better to use
get_object_or_404(…)
[Django-doc], then to use.get(…)
[Django-doc] directly. In case the object does not exists, for example because the user altered the URL themselves, theget_object_or_404(…)
will result in returning a HTTP 404 Not Found response, whereas using.get(…)
will result in a HTTP 500 Server Error.
Upvotes: 1