Django从ListView创建模型
我有一个ListView来列出模型的实例,我希望用户能够从同一页面创建一个新实例 我尝试了CreateView、FormMixin和ModelFormMixin的多重继承,我让它们都工作了,但是当表单无效时,我没有得到验证,我只得到了“视图”对象没有属性“object\u list” 我怎样才能做到这一点 为了处理模型创建,我是否应该分割关注点并有一个单独的视图?如果是这样,如何将无效错误返回到同一模板 我的自动取款机代码:Django从ListView创建模型,django,django-forms,django-views,Django,Django Forms,Django Views,我有一个ListView来列出模型的实例,我希望用户能够从同一页面创建一个新实例 我尝试了CreateView、FormMixin和ModelFormMixin的多重继承,我让它们都工作了,但是当表单无效时,我没有得到验证,我只得到了“视图”对象没有属性“object\u list” 我怎样才能做到这一点 为了处理模型创建,我是否应该分割关注点并有一个单独的视图?如果是这样,如何将无效错误返回到同一模板 我的自动取款机代码: @method_decorator(login_required, n
@method_decorator(login_required, name='dispatch')
class MyView(CreateView, ListView):
model = MyModel
form_class = MyModelForm
template_name = 'MyPage.html'
success_url = reverse_lazy('my_page')
编辑:添加回溯:
Request Method: POST
Request URL: http://127.0.0.1:8000/create/
Django Version: 3.0.8
Python Version: 3.8.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tracker']
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 "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 172, in post
return super().post(request, *args, **kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 144, in post
return self.form_invalid(form)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 61, in form_invalid
return self.render_to_response(self.get_context_data(form=form))
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/edit.py", line 67, in get_context_data
return super().get_context_data(**kwargs)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/detail.py", line 100, in get_context_data
return super().get_context_data(**context)
File "/Users/bidu/gitfolder/expense_tracker/env/lib/python3.8/site-packages/django/views/generic/list.py", line 115, in get_context_data
queryset = object_list if object_list is not None else self.object_list
Exception Type: AttributeError at /create/
Exception Value: 'CreateTransactionView' object has no attribute 'object_list'
您可以按照以下步骤创建自定义表单验证:
class联系人表单(forms.Form):
#一切照旧
def清洁_收件人(自身):
数据=自清理的_数据['recipients']
如果“fred@example.com“不在数据中:
raise forms.ValidationError(“您忘记了Fred!”)
返回数据
“视图”对象没有“对象列表”属性
但是,关于您遇到的这个错误,在做了一些研究之后,我认为您需要重写默认的
self.object\u list
变量,如中所述。但是,我想在您开始使用CreateView之后,您不必再处理这个问题。很多视图都涉及表单和对象列表。与其尝试混入内容,不如将queryset添加到上下文数据中,如下所示。不要错过删除类ListView
@方法\u装饰器(需要登录,name='dispatch')
类MyView(CreateView):
model=MyModel
form_class=MyModelForm
模板名称='MyPage.html'
success\u url=reverse\u lazy(“我的页面”)
def获取上下文数据(自身,**kwargs):
kwargs['object_list']=self.model.objects.all()
返回super(MyView,self)。获取上下文数据(**kwargs)
为什么不在
ListView
页面上创建一个链接,链接到CreateView
页面?你能发布回溯吗?在POST请求中,您可能需要添加一些设置object\u list
的方法,但这两个类的常见方法是get\u context\u object\u name
things@MeL如果表单验证无效,我需要能够在同一模板中获得表单验证,如果我分离视图,我不知道如何进行此操作。@IainShelvington添加了回溯使用此示例,我得到了错误“MyView”对象没有属性“object\u list”
。如果我将类MyView(CreateView,ListView):
更改为类MyView(ListView,CreateView):
我在GET请求中遇到以下错误:“MyView”对象没有属性“object”
@method_decorator(login_required, name='dispatch')
class MyView(CreateView):
model = MyModel
form_class = MyModelForm
template_name = 'MyPage.html'
success_url = reverse_lazy('my_page')
def get_context_data(self, **kwargs):
kwargs['object_list'] = self.model.objects.all()
return super(MyView, self).get_context_data(**kwargs)