Форма Django недействительна

Этот вопрос может быть задан много раз в stackoverflow, но я не смог найти ответ. Взгляните на код:

# models.py
class Message(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.CharField(max_length=200, null=True, blank=True)
    room = models.ForeignKey(Room, on_delete=models.CASCADE, blank=True, null=True)
    posted = models.TimeField(auto_now_add=True)

    def __str__(self):
        return self.body

views.py:

class RoomInsideView(View):
    template_name = 'room/room_inside.html'
    form_class = SendMessageForm
    room = None

    def get(self, request, room_id, room_slug):
        self.room = Room.objects.get(id=room_id)
        if self.room.is_private:
            return redirect('room:private_room_auth', self.room.id)
        form = self.form_class()
        context =  {
                    'room': self.room,
                    'form': form,
        }
        return render(request, self.template_name, context)

    def post(self, request, room_id, room_slug):
        form = self.form_class(request.POST)
        if form.is_valid():
           new_msg = Message(body=form.cleaned_data['body'])
           new_msg.user = request.user  in
           all_messages = Message.objects.filter(room=self.room)
        messages.error(request, 'form not valid', 'warning')
        return render(request, self.template_name, {'form': form, 'message': all_messages})

forms.py:

class SendMessageForm(forms.ModelForm):
    class Meta:
        model = Message
        fields = ('body',)
        widgets = {
            'body': forms.TextInput(attrs={'class': 'form-control',
                                           'placeholder': 'Send'}),
        }

Шаблон:

    <form method="post" action="" novalidate>
        {% csrf_token %}
        {{ form.non_field_errors }}
        {{ form.body.errors }}
        {{ form.body }}
        <input type="submit" value="Send" class="btn btn-primary">
    </form>

Так как я добавил messages.error если форма не действительна она возвращает форму не действительной и я не могу найти где я делаю неправильно

Вы всегда добавляете предупреждение, независимо от того, действительна форма или нет, это не имеет особого смысла.

При этом вы пишете слишком много шаблонного кода, вы можете использовать CreateView, который устранит большую часть шаблонного кода:

from django.shortcuts import get_object_or_404 из django.urls import reverse_lazy

class RoomInsideView(View):
    template_name = 'room/room_inside.html'
    form_class = SendMessageForm
    success_url = reverse_lazy('name-of-some-view')

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['room'] = get_object_or_404(Room, pk=self.kwargs['room_id'], is_private=False)
        return context

    def form_invalid(self, form):
        messages.error(request, 'form not valid', 'warning')
        return super().form_invalid(form)

    def form_valid(self, form):
        form.instance.room_id = self.kwargs['room_id']
        form.instance.user = self.request.user
        return super().form_valid(form)

name-of-some-view следует заменить на имя представления, на которое представление должно перенаправляться в случае успешного POST запроса, это делается для реализации архитектурного паттерна Post/Redirect/Get [wiki].


Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .

Я также обнаружил много ошибок, включая синтаксические ошибки. также я не сохранил новое сообщение. Я исправляю их

Вернуться на верх