znawca
znawca

Reputation: 279

invalid literal for int() with base 10: 'new'

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

Answers (2)

Alasdair
Alasdair

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:

  1. Move the car_new url above the car_detail view.
  2. Change the regex for the primary key so that it matches only digits (at the moment, you are probably using something like \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

Shang Wang
Shang Wang

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

Related Questions