当我提交表单 Django 时,"NoneType"对象不是可调用的错误



当我按下表单的提交按钮时,显示一个错误:'NoneType'对象是不可调用的错误。

表单显示正确,但当张贴我得到这个错误

误差

在全球范围内,我试图有两个形式在一个(通过使用get_context_data)更新页面,我可以修改生物,用户名....

模板:

{% extends 'main.html' %}
{% load crispy_forms_tags %}
{% block title %}
Register
{% endblock %}
{% block body_content %}
<h1>Update your profile</h1>
<form method="POST" action="" enctype="multipart/form-data">
{% csrf_token %}
<fieldset class=form-group">
{{ u_form|crispy  }}
{{ p_form|crispy  }}
</fieldset>
<div class=form-group">
<button class="btn" type="submit">Update</button>
</div>
</form>
{% endblock %}

视图:

from django.contrib.auth.models import User
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import FormView
from django.urls import reverse
from users.forms.forms import UserUpdateForm, ProfileUpdateForm
from users.models.users import Profile
from django.contrib import messages

class UpdateUserView(LoginRequiredMixin, FormView):
template_name = 'base/profile.html'
model = User, Profile
redirect_authenticated_user = True
form_classes = {'u_form': UserUpdateForm,
'p_form': ProfileUpdateForm}
def form_valid(self, form):
if self.request.method == 'POST':
u_form = UserUpdateForm(self.request.user, self.request.POST, self.request.FILES,
instance=self.request.user)
p_form = ProfileUpdateForm(self.request.user.profile, self.request.POST, self.request.FILES,
instance=self.request.user.profile)
if u_form is not None and p_form is not None and u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(self.request, f'Your account has been updated!')
return super().form_valid(form)
else:
messages.success(self.request, f'Sorry, an error occurred while submitting your form. Please check '
f'the information entered and try again. If the problem persists, '
f'please contact customer service for assistance.')
return super().form_invalid(form)
def get_success_url(self):
return reverse('tasks')
def get_context_data(self, **kwargs):
u_form = UserUpdateForm(instance=self.request.user)
p_form = ProfileUpdateForm(instance=self.request.user.profile)
context = {
'u_form': u_form,
'p_form': p_form
}
return context

形式:

class UserUpdateForm(forms.ModelForm):
email = forms.EmailField()
class Meta:
model = User
fields = ['username', 'email']
def update(self):
pass

class ProfileUpdateForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['bio', 'image']

我试图只使用一个表单,但这不是我想要的,我也试图与类基视图工作,我试图避免创建两个页面进行编辑。

错误详情:

•  djangovenvApplibsite-packagesdjangocorehandlersexception.py, line 55, in inner 
55.                 response = get_response(request)
…
Local vars 
•  venvApplibsite-packagesdjangocorehandlersbase.py, line 197, in _get_response 
197.                    response = wrapped_callback(request, *callback_args, **callback_kwargs)
…
Local vars 
•  venvApplibsite-packagesdjangoviewsgenericbase.py, line 103, in view 
96.             self = cls(**initkwargs)
97.             self.setup(request, *args, **kwargs)
98.             if not hasattr(self, "request"):
99.                 raise AttributeError(
100.                        "%s instance has no 'request' attribute. Did you override "
101.                        "setup() and forget to call super()?" % cls.__name__
102.                    )
103.                return self.dispatch(request, *args, **kwargs)
…
104.    
105.            view.view_class = cls
106.            view.view_initkwargs = initkwargs
107.    
108.            # __name__ and __qualname__ are intentionally left unchanged as
109.            # view_class should be used to robustly determine the name of the view
Local vars 
•  venvApplibsite-packagesdjangocontribauthmixins.py, line 73, in dispatch 
73.         return super().dispatch(request, *args, **kwargs)
…
Local vars 
•  venvApplibsite-packagesdjangoviewsgenericbase.py, line 142, in dispatch 
142.            return handler(request, *args, **kwargs)
…
Local vars 
•  venvApplibsite-packagesdjangoviewsgenericedit.py, line 151, in post 
151.            form = self.get_form()
…
Local vars 
•  venvApplibsite-packagesdjangoviewsgenericedit.py, line 39, in get_form 
39.         return form_class(**self.get_form_kwargs())

当您使用Generic FormView时,您没有定义form_class(在FormView中没有名为form_classes的属性)。因此它得到None。但是,当您呈现两个表单时,最好将一个表单传递给超函数,或者将form_class定义为您正在使用的表单之一。所以解决方案是:

return super().form_valid(u_form)  # or p_form

class UpdateUserView(...)
form_class = UserUpdateForm

最新更新