问题描述
我尝试添加新路径,结果发生了
Field 'id' expected a number but got 'logout_view'.
在 pycharm 终端中,我遇到了其他错误 o.O
ValueError: Field 'id' expected a number but got 'favicon.ico'.
文件:
urls.py ->
from django.contrib import admin
from django.urls import path
from Artykuly.views import *
urlpatterns = [
path('admin',admin.site.urls),path('',index,name='index'),path('<category_id>',category,name='category'),path('artykul/<category_id>',article,name='article'),path('login',login_view,name='login_view'),path('register',register_view,name='register_view'),path('logout',logout_view,name='logout_view'),]
views.py
from django.contrib.auth import login
from django.contrib.auth import authenticate,login,logout
from django.shortcuts import render,redirect
from django.http import HttpResponse
from .models import Category,Article
from .forms import LoginForm,RegisterForm
# Create your views here.
def index(request):
Categories = Category.objects.all()
dane = {
'Categories': Categories
}
return render(request,'template.html',dane)
def category(request,category_id):
category_user = Category.objects.get(pk=category_id)
article_data = Article.objects.filter(category_id=category_id).all()
Categories = Category.objects.all()
dane = {
'category_user': category_user,'article_data': article_data,'Categories': Categories,}
return render(request,'category.html',dane)
def article(request,category_id):
article = Article.objects.get(pk=category_id)
article_user = Article.objects.filter(pk=category_id)
Categories = Category.objects.all()
dane = {
'article': article,'article_user': article_user,'artykul.html',dane)
def register_view(request):
form = RegisterForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
email = form.cleaned_data.get("email")
password = form.cleaned_data.get("password1")
password2 = form.cleaned_data.get("password2")
try:
user = User.objects.create_user(username,email,password)
except:
user = None
if user != None:
login(request,user)
return redirect("/")
else:
request.session['register_error'] = 1
return render(request,'forms.html',{'form': form})
def login_view(request):
form = LoginForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(request,username=username,password=password)
if user != None:
login(request,user)
return redirect("/")
else:
request.session['invalid_user'] = 1
return render(request,{'form': form})
def logout_view(request):
logout(request)
return redirect("login")
回溯->
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/logout_view
Django Version: 3.2
Python Version: 3.8.6
Installed Applications:
['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','Artykuly']
Installed Middleware:
['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback (most recent call last):
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\fields\__init__.py",line 1823,in get_prep_value
return int(value)
The above exception (invalid literal for int() with base 10: 'logout_view') was the direct cause of the following exception:
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\core\handlers\exception.py",line 47,in inner
response = get_response(request)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\core\handlers\base.py",line 181,in _get_response
response = wrapped_callback(request,*callback_args,**callback_kwargs)
File "D:\Program Files (x86)\Python\Blog\Blog\Artykuly\views.py",line 19,in category
category_user = Category.objects.get(pk=category_id)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\manager.py",line 85,in manager_method
return getattr(self.get_queryset(),name)(*args,**kwargs)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\query.py",line 424,in get
clone = self._chain() if self.query.combinator else self.filter(*args,line 941,in filter
return self._filter_or_exclude(False,args,kwargs)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\query.py",line 961,in _filter_or_exclude
clone._filter_or_exclude_inplace(negate,line 968,in _filter_or_exclude_inplace
self._query.add_q(Q(*args,**kwargs))
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\sql\query.py",line 1396,in add_q
clause,_ = self._add_q(q_object,self.used_aliases)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\sql\query.py",line 1415,in _add_q
child_clause,needed_inner = self.build_filter(
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\sql\query.py",line 1350,in build_filter
condition = self.build_lookup(lookups,col,value)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\sql\query.py",line 1196,in build_lookup
lookup = lookup_class(lhs,rhs)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\lookups.py",line 25,in __init__
self.rhs = self.get_prep_lookup()
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\lookups.py",line 77,in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "D:\Program Files (x86)\Python\Blog\venv\lib\site-packages\django\db\models\fields\__init__.py",line 1825,in get_prep_value
raise e.__class__(
Exception Type: ValueError at /logout_view
Exception Value: Field 'id' expected a number but got 'logout_view'.
解决方法
发生这种情况的原因是因为你的模式:
path('<category_id>',category,name='category'),
由于您没有指定路径转换器的类型,它被假定为str
ing,因此匹配所有字符串,包括 favicons.ico
。但这可能不起作用,因为这背后的观点 (category
) 预计 category_id
是 int
。
您可以将 category_id
指定为带有 <int:category_id>
的数字序列:
urlpatterns = [
path('admin',admin.site.urls),path('',index,name='index'),path('<int:category_id>',path('artykul/<int:category_id>',article,name='article'),path('login',login_view,name='login_view'),path('register',register_view,name='register_view'),path('logout',logout_view,name='logout_view'),]
这也是login
、logout
等不会被触发的原因:因为如果你不指定category_id
是一个数字序列,它会匹配的第一个路径,因此它会“触发”category
。
另一个错误:
Field 'id' expected a number but got 'logout_view'.
可能是因为 URL(例如在 <a …>
标记中)使用 logout_view
作为 URL,您应该为此使用 {% url … }
template tag [Django-doc]。