我正在关注this tutorial(这是一个好人!)来尝试学习使用Django。我使用的是python3x和Django2.1,因此由于版本不同,我有时需要消除一些皱纹,但到目前为止效果还不错。
现在一切正常,直到我尝试添加安全性为止(用户必须登录才能访问某些功能)。一开始我得到
AttributeError: module 'django.contrib.auth.views' has no attribute 'login'
有点奇怪,但是可以通过更改
来解决url(r'^accounts/login/$', views.login, name='login'),
到 url(r'^ accounts / login / $',views.LoginView,name ='login'),
在urls.py中。现在,我可以进入我的博客主页。不幸的是,当我尝试添加新帖子(需要登录的功能)未登录时,我遇到了一个完全不同的错误:
TypeError: __init__() takes 1 positional argument but 2 were given
这个我无法弄清楚。为什么会显示,如何解决?
出现此错误时的网址是
http://127.0.0.1:8000/accounts/login/?next=/post/new/
我的网站的urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include, url
from django.contrib.auth import views
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')),
url(r'^accounts/login/$', views.LoginView, name='login'),
#importa las urls de la app 'blog' (hay que crear el fichero urls.py en blog/)
path('', include('blog.urls')),
#esta dirige la raiz del site a una app concreta
]
我的应用的urls.py
from django.conf.urls import include, url
from . import views
urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
url(r'^post/new/$', views.post_new, name='post_new'),
url(r'^post/(?P<pk>[0-9]+)/edit/$', views.post_edit, name='post_edit'),
url(r'^drafts/$', views.post_draft_list, name='post_draft_list'),
url(r'^post/(?P<pk>\d+)/publish/$', views.post_publish, name='post_publish'),
url(r'^post/(?P<pk>\d+)/remove/$', views.post_remove, name='post_remove'),
]
和我的应用的views.py
from django.utils import timezone
from django.shortcuts import render, get_object_or_404
from .models import Post
from .forms import PostForm
from django.shortcuts import redirect
from django.contrib.auth.decorators import login_required
# Create your views here.
def post_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts':posts})
def post_detail(request, pk):
post = get_object_or_404(Post, pk=pk)
return render(request, 'blog/post_detail.html', {'post': post})
@login_required
def post_new(request):
if request.method == "POST":
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm()
return render(request, 'blog/post_edit.html', {'form': form})
@login_required
def post_edit(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == "POST":
form = PostForm(request.POST, instance=post)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
return redirect('post_detail', pk=post.pk)
else:
form = PostForm(instance=post)
return render(request, 'blog/post_edit.html', {'form': form})
@login_required
def post_draft_list(request):
posts = Post.objects.filter(published_date__isnull=True).order_by('created_date')
return render(request, 'blog/post_draft_list.html', {'posts': posts})
@login_required
def post_publish(request, pk):
post = get_object_or_404(Post, pk=pk)
post.publish()
return redirect('post_detail', pk=pk)
@login_required
def post_remove(request, pk):
post = get_object_or_404(Post, pk=pk)
post.delete()
return redirect('post_list')