尝试使用auth LoginView

时间:2018-09-12 06:11:32

标签: python-3.x django-2.1

我正在关注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')

0 个答案:

没有答案