我有一个表格可以将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
,还是两者都没有显示。
答案 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
执行此操作。