django表单数据未保存在数据库中
我有一个表单,可以将数据发布到数据库中 我正在使用Django 1.11 视图.pydjango表单数据未保存在数据库中,django,django-forms,django-1.11,Django,Django Forms,Django 1.11,我有一个表单,可以将数据发布到数据库中 我正在使用Django 1.11 视图.py class BusinessCreate(CreateView): model = Business fields = '__all__' @method_decorator(login_required) def dispatch(self, *args, **kwargs): messages.success(self.request, 'dispatch'
class BusinessCreate(CreateView):
model = Business
fields = '__all__'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
messages.success(self.request, 'dispatch')
return super(BusinessCreate, self).dispatch(*args, **kwargs)
def form_valid(self, form):
messages.success(self.request, 'valid')
form.instance.user = self.request.user # set user_id field to session user
form.save()
def get_success_url(self):
messages.success(self.request, 'Business Added Successfully')
return reverse('business:list')
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.views.generic import View
from django.utils.decorators import method_decorator
class LoginRequired(View):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(LoginRequired, self).dispatch(*args, **kwargs)
模板
<form class="card" method="POST">
{% csrf_token %}
{{ form.non_field_errors }}
{{ form.non_field_errors }}
{% render_field form.name class='form-control' placeholder='Business Title' %}
{{ form.name.errors }}
{% render_field form.business_type class='form-control' %}
{{ form.business_type.errors }}
<button class="btn">Add Business</button>
</form>
{%csrf_令牌%}
{{form.non_field_errors}}
{{form.non_field_errors}}
{%render_字段form.name class='form-control'占位符='Business Title'%}
{{form.name.errors}
{%render_字段form.business_type class='form-control'%}
{{form.business_type.errors}}
增加业务
当我提交表单时,它不会保存,也不会返回任何错误。
视图.py中三种方法中的消息
用于检查调用了哪个方法,并且由于只调用了分派,因此它总是打印分派
我使用debug\u工具栏
检查调试请求是POST
还是GET
还是两者都没有,然后显示出来
试试更好的方法
mixins.py
class BusinessCreate(CreateView):
model = Business
fields = '__all__'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
messages.success(self.request, 'dispatch')
return super(BusinessCreate, self).dispatch(*args, **kwargs)
def form_valid(self, form):
messages.success(self.request, 'valid')
form.instance.user = self.request.user # set user_id field to session user
form.save()
def get_success_url(self):
messages.success(self.request, 'Business Added Successfully')
return reverse('business:list')
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.views.generic import View
from django.utils.decorators import method_decorator
class LoginRequired(View):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(LoginRequired, self).dispatch(*args, **kwargs)
视图.py
class BusinessCreate(CreateView):
model = Business
fields = '__all__'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
messages.success(self.request, 'dispatch')
return super(BusinessCreate, self).dispatch(*args, **kwargs)
def form_valid(self, form):
messages.success(self.request, 'valid')
form.instance.user = self.request.user # set user_id field to session user
form.save()
def get_success_url(self):
messages.success(self.request, 'Business Added Successfully')
return reverse('business:list')
from django.contrib.auth.decorators import login_required
from django.core.exceptions import PermissionDenied
from django.views.generic import View
from django.utils.decorators import method_decorator
class LoginRequired(View):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(LoginRequired, self).dispatch(*args, **kwargs)
现在,当您需要任何模型所需的登录时,只需将其包含在您的类中即可
from .mixins import LoginRequired
class BusinessCreate(LoginRequired, CreateView):
template = 'business/create.html'
model = Business
fields = '__all__'
def form_valid(self, form):
messages.success(self.request, 'valid')
form.instance.user = self.request.user # set user_id field to session user
return super(BusinessCreate, self).form_valid(form)
def get_success_url(self):
messages.success(self.request, 'Business Added Successfully')
return reverse('business:list')
这应该很好 首先,您应该向模板中添加form.errors
,以帮助调试问题
{{ form.errors }}
您可能会出现一个错误,用户是必需的。您告诉Django在表单中使用fields=\uuu all\uuu'
包含所有字段,但在模板中只包含两个字段。表单不知道您只渲染了两个字段,它只是认为用户丢失了
应将视图上的字段设置为与在模板中渲染的字段相同
class BusinessCreate(CreateView):
model = Business
fields = ['name', 'business_type']
如果您有自定义模型表单类,则可以设置form\u class
,而不是字段:
class BusinessCreate(CreateView):
model = Business
form_class = BusinessForm
请注意,如果使用的是self.request.user
,则需要处理用户未登录的情况。您可以使用LoginRequiredMixin
来执行此操作。请注意,Django 1.9+已经有一个LoginRequiredMixin
-您不必定义自己的。@Alasdair感谢您参考LoginRequiredMixin
,将调度
的所有外观替换为登录所需的mixin
及其工作状态great@Astik谢谢你教了一个新东西,但答案与所问的问题毫无关系。@AnujTBE,我的意思是这样使用它,它更流畅,对你有用,我的意思是保存数据并给出错误(如果有)。谢谢@Astik,+1为此,我按照你说的做了,但现在它开始给出错误,因为使用ModelFormMixin(BusinessCreate的基类),没有“fields”属性是被禁止的。
Oops,我总是忘记在为create视图设置form
时是否需要fields
。实际上,我认为您根本不需要自定义模型表单,只需在视图上正确设置字段
。我确实创建了自定义表单,因为我必须使用内联表单集
,然后我相信您必须在模型表单和视图中正确设置字段
,我需要在视图中定义字段,而不是在表单中定义?我认为这不是最好的办法。实际上,我正在考虑使用exclude
而不是include
,因为设置了默认值的列很少,而且这些字段的数量远远少于必填字段。