A_K
A_K

Reputation: 922

Receiving an Error when a Form is submitted related to cleaned_data

I am trying to submit a Message form for my Django Project but I keep receiving an error:

AttributeError at /
'MessageForm' object has no attribute 'cleaned_data'

I am not sure what is the reason for getting this error although I revised the https://docs.djangoproject.com/en/3.1/topics/forms/

Here is my views.py

def home(request):
    if request.method == 'POST': #Check Post
        form = MessageForm(request.POST)
        if form.is_valid():
            data = MessageForm() #Create Relationship with Model
            data.name= form.cleaned_data['name']
            data.email= form.cleaned_data['email']
            data.message= form.cleaned_data['message']
            data.ip = request.META.get('REMOTE_ADDR')
            data.save()
            messages.success(request,'Your Message has been sent, Thank you!')
            return HttpResponseRedirect('base:home')

    template_name = 'base/home.html'
    form = MessageForm()
    ----------------------other unrelated contexts--------------------
    context = {
        'form': form,
    }
    return render(request, template_name, context)

Here is the urls.py

urlpatterns = [
    path('', views.home,name='home')
]

Here is the template.html

        <form class="form" id="form" method="post">
            {% csrf_token %}
            <div class="row">
                <div class="col-md-6">
                    <div class="form-group">
                        <input name="name" id="form-name" type="text" placeholder="Your Name" class="form-control input" autocomplete="off"/>
                        <div id="name-error"></div>
                    </div>
                </div>
                <div class="col-md-6">
                    <div class="form-group">
                        <input name="email" id="form-email" type="email" class="form-control input" placeholder="Your E-Mail" autocomplete="off">
                        <div id="email-error"></div>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <textarea name="message" id="form-message" class="form-control input" rows="7" placeholder="Your Message here ..." autocomplete="off"></textarea>
                <div id="message-error"></div>
            </div>
            <!-- Messages -->
            {% if messages %}
                {% for message in messages %}
                    <div class="container">
                        <div class=" alert alert-{{ message.tags }}">
                        {{ message }}
                        </div>
                    </div>
                {% endfor %}
            {% endif %}
            <!-- Messages -->
            <input id="form-submit" type="submit">
                <div class="send-message" >
                    Send <i class="ni ni-send"></i>
                </div>
        </form>

Upvotes: 1

Views: 42

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477804

You are constructing a new form, but that does not make much sense. Once your orignal form is validated, you can save that form, so:

def home(request):
    if request.method == 'POST':
        form = MessageForm(request.POST)
        if form.is_valid():
            form.instance.ip = request.META.get('REMOTE_ADDR')
            form.save()
            messages.success(request,'Your Message has been sent, Thank you!')
            return redirect('base:home')
    # …

Upvotes: 1

Related Questions