Home > Blockchain >  Django form's not valid
Django form's not valid

Time:03-01

This question might be asked alot in stackoverflow but i couldn't find the answer. Take a look at code:

# 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'}),
        }

template:

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

as I added a messages.error if form is not valid it's returning form not valid and I can't find where am I doing wrong

CodePudding user response:

You always add the warning, regardless whether the form is valid or not, this does not make much sense.

That being said, you are writing too much boilerplate code, you can use a CreateView which will eliminate most of the boilerplate code:

from django.shortcuts import get_object_or_404 from 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)

The name-of-some-view should be replaced with the name of the view where the view should redirect to in case of a successful POST request, this is done to implement the Post/Redirect/Get architectural pattern [wiki].


Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.

CodePudding user response:

I also realized lots of bugs including syntax errors. also I didn't save the new message . I fix them

  • Related