django表单数据未保存在数据库中

django表单数据未保存在数据库中,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'

我有一个表单,可以将数据发布到数据库中

我正在使用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')
        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
,因为设置了默认值的列很少,而且这些字段的数量远远少于
必填字段。