【问题标题】:AttributeError at /blog/create/blog-post/blog/create/blog-post 处的 AttributeError
【发布时间】:2021-10-21 18:18:15
【问题描述】:

我正在学习 django,但这个错误让我感到恶心。 我想创建一个表单来注册新的博客文章。但我得到了这个似乎没有人得到的奇怪错误。 我真的是 django 的初学者。 这是跟踪:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/blog/create/blog-post

Django Version: 3.2.6
Python Version: 3.9.6
Installed Applications:
['blog',
 'django_summernote',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
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 "C:\My_Stuff\Blogistan\env\lib\site- 
    packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
    File "C:\My_Stuff\Blogistan\env\lib\site-packages\django\core\handlers\base.py", 
    line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "C:\My_Stuff\Blogistan\blog\views.py", line 19, in BlogPostForm
    form = BlogPostForm(request.POST or None)
    File "C:\My_Stuff\Blogistan\blog\views.py", line 19, in BlogPostForm
    form = BlogPostForm(request.POST or None)

Exception Type: AttributeError at /blog/create/blog-post
Exception Value: 'NoneType' object has no attribute 'POST'

这是我的控制台:

Internal Server Error: /blog/create/blog-post
Traceback (most recent call last):
  File "C:\My_Stuff\Blogistan\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\My_Stuff\Blogistan\env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\My_Stuff\Blogistan\blog\views.py", line 19, in BlogPostForm
    form = BlogPostForm(request.POST)
  File "C:\My_Stuff\Blogistan\blog\views.py", line 19, in BlogPostForm
    form = BlogPostForm(request.POST)
AttributeError: 'QueryDict' object has no attribute 'POST'

我的views.py

def BlogPostForm(request):
    form = BlogPostForm(request.POST)
    return render(request, 'create_post.html', {
        'form': form})

我正在尝试整合django-summernote`` My forms.py```:

from django.forms import ModelForm
from blog.models import BlogPost
from django_summernote.widgets import SummernoteWidget

class BlogPostForm(ModelForm):
    class Meta:
        model = BlogPost
        fields = '__all__'
        widgets = {
            'content_html': SummernoteWidget(),
        }

我的models.py

class BlogPost(models.Model):
    title = models.CharField(max_length=360)
    urlpattern = models.CharField(max_length=360)
    content_html = TextField(max_length=12000)
    date_added = models.DateField(auto_now_add=True)
    author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.title

我的模板:

{% extends 'layout.html' %}

{% block body %}
    <form class="post-form" method="post">
        {% csrf_token %}
        {{form.as_p}}
        <button type="submit" class="btn btn-default">Submit</button>  
    </form>
{% endblock body %}

有人可以帮我解决这个问题吗? 非常感谢您的帮助。

【问题讨论】:

    标签: python django django-models django-forms django-templates


    【解决方案1】:

    感谢您的帮助。 这是我在 Stackoverflow 上的第一个问题。没想到这么快的回答。 我很不擅长给变量名。 我解决这个问题的方法是使用django.views.generic.edit.CreateView,这是我现在的看法。

    class BlogPostCreateView(CreateView):
       form_class = BlogPostForm
       model = BlogPost
       template_name = 'create_post.html'
       success_url='/'
    

    这是表格。

    class BlogPostForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            kwargs.setdefault('label_suffix', '')
            super(BlogPostForm, self).__init__(*args, **kwargs)
        content_html = forms.CharField(widget=SummernoteWidget)
        class Meta:
            model = BlogPost
            fields = '__all__'
            label_suffix = ''
            labels = {
                'content_html': '',
                'title': 'Title',
                'urlpattern': 'Slug'
            }
            widgets = {
                'title': forms.TextInput(attrs={
                    'class': 'form-control',
                }),
                'urlpattern': forms.TextInput(attrs={
                    'class': 'form-control',
                }),
            }
    

    这很好用,而且造型比以往任何时候都容易

    【讨论】:

      【解决方案2】:

      您需要重命名视图函数BlogPostForm,因为它会覆盖导入的同名表单。

      发生错误是因为使用参数request.POST 递归调用视图函数,这是一个QueryDict,因此错误:

      AttributeError: 'QueryDict' object has no attribute 'POST'
      

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2017-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多