我正在按照本教程(这是一个很好的教程!)来尝试学习使用 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
而这个我想不通。为什么会显示,我该如何解决?
我收到此错误时的 URL 是
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')