Почему форма возвращает «Метод не разрешен» при расширении CreateView CBV в DJANGO - PullRequest
0 голосов
/ 25 июня 2019

Я не уверен, что здесь не работает правильно.CBV CreateView включает форму, но когда я пытаюсь нажать «отправить» в шаблоне, я получаю «ошибку» Method Not Allowed (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()
        }

class PropertyDetailView(DetailView):
    model = PropertyListing
    context_object_name = 'name'
    template_name = 'core/property-detail.html'


    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'))
        # Form
        context['form'] = BookingForm()
        return context

простоформа HTML


 <form class="col-sm-3" role="form" action="" method="POST">
            {% csrf_token %}
            {{ form|crispy }}
     <input class="btn btn-primary" type="submit" value="Create" />
 </form>

Кто-нибудь имеет представление, почему?

1 Ответ

2 голосов
/ 26 июня 2019

Как и в сообщении об ошибке, DetailView [Django-doc] не реализует обработчик для запросов POST.Поэтому, если вы сделаете POST-запрос к обработчику, он выдаст ошибку HTTP 405. Метод не разрешен.

Таким образом, нам потребуется реализовать обработчик для POST-запроса самостоятельно.Хорошей новостью является то, что в ModelFormMixin [Django-doc] уже реализована большая функциональность.Таким образом, мы можем реализовать это следующим образом:

class PropertyDetailView(<b>ModelFormMixin</b>, DetailView):
    model = PropertyListing
    context_object_name = 'name'
    template_name = 'core/property-detail.html'
    <b>form_class = BookingForm</b>
    <b>success_url</b> = ...

    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 <b>post</b>(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)

Таким образом, вам не нужно добавлять Form к данным контекста (ModelFormMixin сделает это), а также вам не нужно обрабатывать форму самостоятельно.,Однако вам нужно будет указать success_url [Django-doc] или переопределить метод form_valid [Django-doc] .

При этом может быть лучше использовать CreateView [Django-doc] или UpdateView [Django-doc] , и просто примените некоторые изменения кода, чтобы добавить в него детали своих объектов.

...