Reputation: 279
I tried to create forms.py file, new view etc but when i click on my website on link to create "new car" i get an error:
ValueError at /car/new/
invalid literal for int() with base 10: 'new'
I searched solution in documentation few times, but it looks like it should - so how to repair this?
model.py
class Vehicle(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=50)
description = models.TextField()
icon = models.ImageField(upload_to='icons/images/')
class Car(models.Model):
name = models.CharField(max_length=50)
slug = models.SlugField(max_length=50)
description = models.TextField(default='Car', max_length=1000)
icon = models.ImageField(upload_to='icons/images', blank=True)
vehicle = models.ForeignKey('Vehicle')
urls.py:
url(r'^car/new/$', views.car_new, name='car_new'),
views.py:
def car_new(request):
if request.method == "POST":
form = CarForm(request.POST, request.FILES)
if form.is_valid():
car = form.save(commit=False)
car.save()
form.save_m2m()
return redirect('website.views.car_detail', pk=car.pk)
else:
form = CarForm()
return render(request, 'website/car_new.html', {'form': form})
forms.py:
class CarForm(forms.ModelForm):
vehicle = forms.ModelChoiceField(label="Vehicle", queryset=Vehicle.objects.all())
class Meta:
model = Car
fields = ('name', 'description', 'icon', 'vehicle',)
car_new.html:
{% block content %}
<div>
<form method="post" enctype="multipart/form-data">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">OK</button>
</form>
</div>
{% endblock %}
Line in base.html file:
<a href="/car/new">New car</a>
Traceback:
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\core\handlers\base.py" in get_response
149. response = self.process_exception_by_middleware(e, request)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\core\handlers\base.py" in get_response
147. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\name\djangofolder\myproject\website\views.py" in car_detail
23. car = get_object_or_404(Car, pk=pk)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\shortcuts.py" in get_object_or_404
155. return queryset.get(*args, **kwargs)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\query.py" in get
378. clone = self.filter(*args, **kwargs)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\query.py" in filter
790. return self._filter_or_exclude(False, *args, **kwargs)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\query.py" in _filter_or_exclude
808. clone.query.add_q(Q(*args, **kwargs))
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\sql\query.py" in add_q
1243. clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\sql\query.py" in _add_q
1269. allow_joins=allow_joins, split_subq=split_subq,
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\sql\query.py" in build_filter
1203. condition = self.build_lookup(lookups, col, value)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\sql\query.py" in build_lookup
1099. return final_lookup(lhs, rhs)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\lookups.py" in __init__
19. self.rhs = self.get_prep_lookup()
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\lookups.py" in get_prep_lookup
57. return self.lhs.output_field.get_prep_lookup(self.lookup_name, self.rhs)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_lookup
744. return self.get_prep_value(value)
File "C:\Users\name\djangofolder\venv\lib\site-packages\django\db\models\fields\__init__.py" in get_prep_value
976. return int(value)
Exception Type: ValueError at /car/new/
Exception Value: invalid literal for int() with base 10: 'new'
car_detail.py
def car_detail(request, pk):
car = get_object_or_404(Car, pk=pk)
return render(request, 'website/car_detail.html', {'car': car})
Upvotes: 0
Views: 981
Reputation: 309049
The url for /car/new/
is resolving to your car_detail
view, instead of the car_new
view.
You haven't shown your url patterns, so I can't give a precise answer, but you can probably fix the problem by doing either of the following:
car_new
url above the car_detail
view.\w+
, which matches strings like new
.Putting that together, you something like:
url(r'^car/new/$', views.car_new, name='car_new'),
url(r'^car/(?P<pk>\d+)/$', views.car_detail, name='car_detail'),
Upvotes: 1
Reputation: 25549
You should learn to read the traceback. Here is the error:
car = get_object_or_404(Car, pk=pk)
and the error happens in:
File "C:\Users\name\djangofolder\myproject\website\views.py" in car_detail
You passed the pk
in url as a string new
, but your car_detail
method is expecting an integer which represents the pk of Car
. If you read the error message again it should make more sense.
Upvotes: 0