Akshay
Akshay

Reputation: 11

I am not able to save the form data to databse in django

I want to add data through form and see it queried in my template

blog url:

urlpatterns = [

    url(r'^admin/',admin.site.urls),
    url(r'^blog/',include('content.urls',)),
]

content url:

urlpatterns = [
    url(r'^add/$', views.add_content, name='content'),
]

models.py

from django.db import models

class AddContent(models.Model):
    content_name = models.CharField(max_length=100, default='', blank=False, unique=True)

def __str__(self):
    return self.content_name

forms.py

from django import forms
from .models import AddContent

class AddContentForm(forms.ModelForm):
    class Meta:
        model = AddContentModel
        fields = [
            "content_name",
        ]

views.py

def add_content(request):
    form = AddContentForm(request.POST or None)
    if form.is_valid():
        instance = form.save(commit=False)
        instance.save()
        return redirect("/blog/content/")

    content_data = AddContent.objects.all()

    context = {
        "form":form,
        "content":content_data,
    }
    return render(request, "add_content.html", context)

def view_content(request):
    view_data = AddContent.objects.all()
    context = {
        "show_content":view_data,
    }
    return render(request, 'show_content.html', context)

templates: add_content.html

{% extends 'base.html' %}

{% block content %}

<form method='POST' action="/blog/content/">
{% csrf_token %}
{{ form.as_p }}
<input type='submit' value='Add Content'/>

<h3>Recent content</h3>
{% for show in show_content %}
<p>{{ show.content_name }}</p>
{% endfor %}

{% endblock %}

The form data is not being saved, when I add it through admin interface it gives the result but form fails.

(this is just some useless content that I am writing in the bracket, stackoverflow didn't allow me posting as it looks like my post is mostly code; please add more details it said but i think the code has lot of details and i cant write anything just for the sake of length)

Upvotes: 0

Views: 77

Answers (4)

Alouani Younes
Alouani Younes

Reputation: 1046

First : Correct the redirect() in your form.

return redirect("add_content", request.POST= None)

Second : you need to specify a URL for the content view : view_content

url(r'^content/$', views.view_content, name='content'),

And You need a template to render content (show_content.html :

{% extends 'base.html' %}

    {% block content %}


    <h3>Recent content</h3>
    {% for show in show_content %}
    <p>{{ show.content_name }}</p>
    {% endfor %}

    {% endblock %}

Edit :

Your form is not well defined. I edit my answer to make it complete :

You have to correct the model in your form (AddContent not AddContentModel) :

class Meta:
    model = **AddContent**
    fields = [
        "content_name",
    ]    

Upvotes: 0

arif
arif

Reputation: 471

Your model form should look like this

from django import forms
from .models import AddContent

class AddContentForm(forms.ModelForm):
class Meta:
    model = AddContent
    fields = [
        "content_name",
    ]

You've defined the wrong model name in the Meta class of model form. It should be AddContent not AddContentModel

Upvotes: 1

Daniel Roseman
Daniel Roseman

Reputation: 600041

Your form does not post to the view that saves the data; it posts directly to the view_content view, which ignores the data completely.

You can set the form action to "." to get it to post back to the same view that rendered it.

(As an additional point, you should avoid hard-coding URLs. Use the {% url %} tag in templates, and the reverse() function in views, to output URLs based on view names.)

Upvotes: 0

xplo4d
xplo4d

Reputation: 260

I'm new to django too, but don't you need to specify the request inside the functions in views.py like :

def add_content(request):
    if(request.method == 'POST'):
        # rest of code here

Upvotes: 0

Related Questions