Python 为什么表单返回';方法不允许';在DJANGO中扩展CreateView CBV时
我不确定这里有什么地方不正常。CBV CreateView包含一个表单,但当我尝试单击模板中的“提交”时,我收到“错误”Python 为什么表单返回';方法不允许';在DJANGO中扩展CreateView CBV时,python,django,python-3.x,django-forms,django-views,Python,Django,Python 3.x,Django Forms,Django Views,我不确定这里有什么地方不正常。CBV CreateView包含一个表单,但当我尝试单击模板中的“提交”时,我收到“错误”方法不允许(POST) forms.py class DateInput(forms.DateInput): input_type = 'date' class BookingForm(forms.ModelForm): class Meta: model = Booking fields = ('check_in',
方法不允许(POST)
forms.py
class DateInput(forms.DateInput):
input_type = 'date'
class BookingForm(forms.ModelForm):
class Meta:
model = Booking
fields = ('check_in',
'check_out')
widgets = {
'check_in': DateInput(),
'check_out': DateInput()
}
只是形式而已
HTML
{%csrf_令牌%}
{{form | crispy}}
有人知道为什么吗?正如错误所说,a没有实现POST请求的处理程序。因此,如果您向处理程序发出POST请求,它将生成HTTP 405错误:方法不允许
因此,我们需要自己为POST请求实现一个处理程序。好消息是,许多功能已经在中实现。因此,我们可以这样实施:
class PropertyDetailView(ModelFormMixin, DetailView):
model = PropertyListing
context_object_name = 'name'
template_name = 'core/property-detail.html'
form_class = BookingForm
success_url = ...
def get_context_data(self, *args, **kwargs):
context = super(PropertyDetailView, self).get_context_data(**kwargs)
context['property_details'] = PropertyListing.objects.filter(pk=self.kwargs.get('pk'))
return context
def post(self, *args, **kwargs):
self.object = None
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
class PropertyDetailView(ModelFormMixin,DetailView):
模型=属性列表
上下文\对象\名称='name'
模板名称='core/property detail.html'
form_class=预订表单
成功\u url=。。。
def获取上下文数据(self、*args、**kwargs):
context=super(PropertyDetailView,self)。获取上下文数据(**kwargs)
context['property\u details']=PropertyListing.objects.filter(pk=self.kwargs.get('pk'))
返回上下文
def post(自我,*args,**kwargs):
self.object=None
form=self.get\u form()
如果form.is_有效():
返回self.form\u有效(form)
其他:
返回self.form\u无效(form)
因此,您不需要将表单
添加到上下文数据中(ModelFormMixin将这样做),也不需要自己处理表单。但是,您将需要指定或重写
也就是说,使用a或an可能更好,只需应用一些代码更改即可向其中添加对象的详细信息。如错误所述,a不实现POST请求的处理程序。因此,如果您向处理程序发出POST请求,它将生成HTTP 405错误:方法不允许
因此,我们需要自己为POST请求实现一个处理程序。好消息是,许多功能已经在中实现。因此,我们可以这样实施:
class PropertyDetailView(ModelFormMixin, DetailView):
model = PropertyListing
context_object_name = 'name'
template_name = 'core/property-detail.html'
form_class = BookingForm
success_url = ...
def get_context_data(self, *args, **kwargs):
context = super(PropertyDetailView, self).get_context_data(**kwargs)
context['property_details'] = PropertyListing.objects.filter(pk=self.kwargs.get('pk'))
return context
def post(self, *args, **kwargs):
self.object = None
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
class PropertyDetailView(ModelFormMixin,DetailView):
模型=属性列表
上下文\对象\名称='name'
模板名称='core/property detail.html'
form_class=预订表单
成功\u url=。。。
def获取上下文数据(self、*args、**kwargs):
context=super(PropertyDetailView,self)。获取上下文数据(**kwargs)
context['property\u details']=PropertyListing.objects.filter(pk=self.kwargs.get('pk'))
返回上下文
def post(自我,*args,**kwargs):
self.object=None
form=self.get\u form()
如果form.is_有效():
返回self.form\u有效(form)
其他:
返回self.form\u无效(form)
因此,您不需要将表单
添加到上下文数据中(ModelFormMixin将这样做),也不需要自己处理表单。但是,您将需要指定或重写
也就是说,使用a或an可能更好,只需应用一些代码更改即可向其中添加对象的详细信息。a
DetailView
通常不接受POST调用。您可以实现def post(..)
,但最好使用FormMixin
这有大量重复项。请注意,与标题相反,您没有扩展CreateView。DetailView
通常不接受post调用。您可以实现def post(..)
,但最好使用FormMixin
这有大量重复项。请注意,与标题相反,您没有扩展CreateView。
class PropertyDetailView(ModelFormMixin, DetailView):
model = PropertyListing
context_object_name = 'name'
template_name = 'core/property-detail.html'
form_class = BookingForm
success_url = ...
def get_context_data(self, *args, **kwargs):
context = super(PropertyDetailView, self).get_context_data(**kwargs)
context['property_details'] = PropertyListing.objects.filter(pk=self.kwargs.get('pk'))
return context
def post(self, *args, **kwargs):
self.object = None
form = self.get_form()
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)