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

时间:2017-10-07 07:55:19

标签: django django-forms django-1.11

我有一个表格可以将POST数据发送到数据库。

我正在使用Django 1.11

views.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')

模板

<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>

当我提交表单时,它不会保存,也不会返回任何错误。

messages中的三个方法中的views.py用于检查调用哪个方法,并且它始终打印dispatch,因为只调用了一个调度。

我使用debug_toolbar检查调试请求是POST还是GET,还是两者都没有显示。

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试更好的方式。

<强> mixins.py

 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)

<强> views.py

现在,只要您需要登录任何型号,只需将其包含在您的班级中。

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')

这应该可以正常工作!!!

答案 1 :(得分:1)

首先,您应该将form.errors添加到模板中以帮助调试问题。

{{ form.errors }}

您可能会遇到user所需的错误。您告诉Django在表单中包含fields = __all__'的所有字段,但您只在模板中包含两个字段。表单不知道你只渲染了两个字段,它只是认为用户丢失了。

您应该将视图上的fields设置为与您在模板中呈现的字段相同。

class BusinessCreate(CreateView):
    model = Business
    fields = ['name', 'business_type']

如果您有自定义模型表单类,则可以设置form_class而不是字段:

class BusinessCreate(CreateView):
    model = Business
    form_class = BusinessForm

请注意,如果您使用self.request.user,则需要处理用户未登录的情况。您可以使用LoginRequiredMixin执行此操作。