ValueError - Python Django

Я прошел форумы и сделал некоторые изменения в моих кодах, но проблема все еще там. Я сделал миграцию и сделал миграцию, и даже удалил миграцию и воссоздаю ее снова.

Я также добавил default=0 в код models.py:

age = models.PositiveIntegerField (по умолчанию =0)

Я буду признателен вам, если вы поможете мне в этом вопросе. Это несколько строк кода, дайте мне знать, если вам нужна другая информация.

Это ошибка:

ValueError at /basic_app/create/
invalid literal for int() with base 10: 'create'
Request Method: GET
Request URL:    http://127.0.0.1:8000/basic_app/create/
Django Version: 2.1.2
Exception Type: ValueError
Exception Value:    
invalid literal for int() with base 10: 'create'
Exception Location: C:\ProgramData\Miniconda3\envs\myDjanEnv\lib\site-packages\django\db\models\fields\__init__.py in get_prep_value, line 965
Python Executable:  C:\ProgramData\Miniconda3\envs\myDjanEnv\python.exe
Python Version: 3.7.0
Python Path:    
['C:\\Users\\Administrator\\Desktop\\django_lecture\\djan_advance\\advcbv',
 'C:\\ProgramData\\Miniconda3\\envs\\myDjanEnv\\python37.zip',
 'C:\\ProgramData\\Miniconda3\\envs\\myDjanEnv\\DLLs',
 'C:\\ProgramData\\Miniconda3\\envs\\myDjanEnv\\lib',
 'C:\\ProgramData\\Miniconda3\\envs\\myDjanEnv',
 'C:\\ProgramData\\Miniconda3\\envs\\myDjanEnv\\lib\\site-packages']

Это файл __init__.py, строка 960-965:

def get_prep_value(self, value):
    from django.db.models.expressions import OuterRef
    value = super().get_prep_value(value)
    if value is None or isinstance(value, OuterRef):
        return value
    return int(value)

Файл models.py:

from django.db import models

# Create your models here.
class School(models.Model):
    name = models.CharField(max_length=128)
    principal = models.CharField(max_length=128)
    location = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Student(models.Model):
    name = models.CharField(max_length=128)
    age = models.PositiveIntegerField()
    school = models.ForeignKey(School,related_name='students',on_delete=models.PROTECT)

    def __str__(self):
        return self.name

Файл urls.py в папке basic_app:

from django.conf.urls import url
from basic_app import views

app_name = 'basic_app'

urlpatterns = [
    url(r'^$',views.schoolListView.as_view(),name='list'),
    url(r'^(?P<pk>[-\w]+)/$',views.schoolDetailView.as_view(),name='detail'),
    url(r'^create/$',views.schoolCreateView.as_view(),name='create')
]

файл views.py:

from django.shortcuts import render
from django.views.generic import (View,TemplateView,
                                ListView,DetailView,
                                CreateView,UpdateView,
                                DeleteView)
from . import models

class IndexView(TemplateView):
    template_name = 'index.html'

class schoolListView(ListView):
    context_object_name = 'schools'
    model = models.School

class schoolDetailView(DetailView):
    context_object_name = 'school_detail'
    model = models.School
    template_name = 'basic_app/school_detail.html'

class schoolCreateView(CreateView):
    fields = ('name','principal','location')
    model = models.School

1 ответ

Решение

Проблема в том, что вы захватили регулярное выражение для pk в подробном маршруте в urls.py, особенно в этой строке:

url(r'^(?P<pk>[-\w]+)/$',views.schoolDetailView.as_view(),name='detail'),

Я думаю ты имел ввиду [-\w] как не альфа-символы, но это ищет дефис (-) или любой буквенный, цифровой или символ подчеркивания (\w). Таким образом, когда вы идете на маршрут /basic_app/create/, 'create' соответствует шаблону [-\w]+ и используется в качестве первичного ключа. поскольку 'create' состоит из буквенных символов и не может быть приведен к целому числу, вы получаете ошибку "invalid literal for int() with base 10: 'create'",

Чтобы исправить это, я думаю, вы захотите сопоставлять только числовые символы для подробного маршрута. Вы могли бы сделать что-то вроде:

url(r'^(?P<pk>\d+)/$',views.schoolDetailView.as_view(),name='detail'),
Другие вопросы по тегам