1

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

我在用着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')

模板

<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检查调试是否请求是POSTGET两者都不是,它显示。

在此处输入图像描述

4

2 回答 2

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)

视图.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')

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

于 2017-10-07T08:02:06.983 回答
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来执行此操作。

于 2017-10-07T08:17:26.873 回答