【问题标题】:AttributeError: module 'posts.views' has no attribute 'edit'AttributeError:模块“posts.views”没有属性“编辑”
【发布时间】:2019-12-21 19:53:33
【问题描述】:

我正在尝试将从我的 views.py 文件创建的视图导入到我的 django 项目的 urls.py 文件中。这样做后,终端显示属性错误。我正在关注一个说它有效但我不知道该怎么做的教程

我什么都试过了。我还检查了堆栈溢出消息。没有任何帮助。

posts/views.py

from django.shortcuts import render, redirect, get_object_or_404
from .forms import PostForm
from .models import Post
from django.views.generic import ListView, DetailView


# Create your views here.
class IndexView(ListView):
    template_name = 'posts/index.html'
    context_object_name = 'post_list'

    def get_queryset(self):
        return Post.objects.all()


class PostDetailView(DetailView):
    model = Post
    template_name = 'posts/post-detail.html'

    def postview(request):
        if request.method == 'POST':
            form = PostForm(request.POST)
            if form.is_valid():
                form.save()
            return redirect('index')
        form = PostForm()
        return render(request, 'posts/post.html', {'form': form})

    def edit(request, pk, template_name='posts/edit.html'):
        post = get_object_or_404(Post, pk=pk)
        form = PostForm(request.POST or None, instance=post)
        if form.is_valid():
            form.save()
            return redirect('index')
        return render(request, template_name, {'form': form})

    def delete(request, pk, template_name='posts/confirm_delete,html'):
        post = get_object_or_404(Post, pk=pk)
        if request.method == 'POST':
            post.delete()
            return redirect('index')
        return render(request, template_name, {'object': post})

posts/urls.py

from django.urls import path
from . import views
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('<int:pk>/', views.PostDetailView.as_view(), name='detail'),
    path('edit/<int:pk>/', views.edit, name='edit'),
    path('post/', views.postview, name='post'),
    path('delete/<int:pk>/', views.delete, name='delete'),
]

该网站旨在启动并运行并显示预加载的帖子。相反,我看到此错误消息

文件“C:\Users****\PycharmProjects\CRUD\CRUD\posts\urls.py”,第 6 行,在 路径('edit//',views.edit,name='edit'), AttributeError: 模块 'posts.views' 没有属性 'edit'

【问题讨论】:

    标签: python django pycharm frontend


    【解决方案1】:

    .edit 和 .postview 和 .delete 是 PostDetailView 方法,你不能像那样访问它们 相反,如果你想用基于类的视图 (CBV) 来实现这些方法,你应该使用其他预编码的通用视图

    CreateView

    UpdateView

    DeleteView

    所以你应该实现这 3 个 CBV,PostCreateView、PostUpdateView、PostDeleteView 之后你的 url 模式最终会是这样的:

    urlpatterns = [
        path('', views.IndexView.as_view(), name='index'),
        path('<int:pk>/', views.PostDetailView.as_view(), name='detail'),
        path('edit/<int:pk>/', views.PostUpdateView.as_view(), name='edit'),
        path('post/', views.PostCreateView.as_view(), name='post'),
        path('delete/<int:pk>/', views.PostDeleteView.as_view(), name='delete'),
    ]
    

    编码愉快!

    【讨论】:

    • 这不是这里的问题,他正在学习教程。
    • 这是一个解决问题的方法,在这种情况下,为什么要同时使用 cbv 和基于函数的视图呢?在我看来让代码变得混乱,他/她无论如何都接受了错误的奇怪答案!
    【解决方案2】:

    你的缩进是错误的:

    class PostDetailView(DetailView):
        model = Post
        template_name = 'posts/post-detail.html'
    
    def postview(request):
        if request.method == 'POST':
            form = PostForm(request.POST)
            if form.is_valid():
                form.save()
            return redirect('index')
        form = PostForm()
        return render(request, 'posts/post.html', {'form': form})
    
    def edit(request, pk, template_name='posts/edit.html'):
        post = get_object_or_404(Post, pk=pk)
        form = PostForm(request.POST or None, instance=post)
        if form.is_valid():
            form.save()
            return redirect('index')
        return render(request, template_name, {'form': form})
    
    def delete(request, pk, template_name='posts/confirm_delete,html'):
        post = get_object_or_404(Post, pk=pk)
        if request.method == 'POST':
            post.delete()
            return redirect('index')
        return render(request, template_name, {'object': post})
    

    【讨论】:

    • 您为这些函数(postvieweditdelete)添加了额外的 4 个空格,因此它们成为了 PostDetailView 类的一部分。您应该将它们移动到与该类相同的缩进级别,就像我在回答中所做的那样。
    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2018-04-14
    • 2019-02-18
    • 1970-01-01
    • 2020-01-01
    • 2019-07-20
    • 2021-11-05
    相关资源
    最近更新 更多