Ibo
Ibo

Reputation: 4299

Save data to database using Django forms

my Save button does not save the user entered data into the database in a django form, where is the problem?

models.py

class Cemetery(models.Model):
    id = models.AutoField(primary_key=True)
    name=models.CharField(verbose_name="Cemetery Name",max_length=100)
    city=models.CharField(max_length=30)
    zipcode=models.CharField(max_length=5)
    date_created=models.DateTimeField(editable=False, auto_now_add=True)
    date_modified= models.DateTimeField(editable=False, auto_now=True)
    created_by=models.ForeignKey('auth.User')

    def __str__(self):
        return  str(self.id) +'-' + self.name + ' -  ' + self.city

forms.py

class CemeteryForm(forms.ModelForm):
     class Meta:
        model=Cemetery
        fields=('name','city','zipcode',)

views.py

def cemetery_add(request):
    if request.method=="POST":
        form=CemeteryForm(request.POST)
        if form.is_valid():
            cemetery=form.save(commit=False)
            cemetery.name=request.name
            cemetery.city=request.city
            cemetery.zipcode=request.zipcode
            cemetery.created_by=request.user
            cemetery.date_created=timezone.now()
            cemetery.save()
            return redirect('cemetery_list')
    else:
        form=CemeteryForm
    return render(request,'heaven/edit_cemetery.html',{'form':form})

template

{% extends 'heaven/base.html' %}

{% block content %}
    <!-- Edit Cemetery -->
    <h2>New Cemetery</h2>
    <form method="POST" class="cemetery-form">{% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
{% endblock %}

when I push the save button, this is the error I receive: AttributeError at /cemetery_add/ 'WSGIRequest' object has no attribute 'name'

Upvotes: 0

Views: 4896

Answers (2)

Ibo
Ibo

Reputation: 4299

This one worked, I had an authentication problem, since my login session was expired I could not save:

def cemetery_add(request):
if request.method=='POST':
    form=CemeteryForm(request.POST)
    if form.is_valid():
        cemetery=form.save(commit=False)
        cemetery.name=request.POST.get('name')
        cemetery.city=request.POST.get('city')
        cemetery.zipcode=request.POST.get('zipcode')
        cemetery.date_created=timezone.now()
        if request.user.is_authenticated:
            cemetery.created_by=request.user
        else:
            return login(request)
        cemetery.save()
        return redirect('cemetery_list')
else:
    form=CemeteryForm
return render(request,'heaven/edit_cemetery.html',{'form':form})

Upvotes: 0

Sayse
Sayse

Reputation: 43300

In your form, you're looking up values directly on the request

request.name

You need to look in the form's cleaned data

form.cleaned_data.get('name')

Although, this isn't actually needed since the value is already set from the bound form.

If you really want to use the post data then it would be found in the POST dictionary

request.POST.get('name')

In short, ignore resetting these values and just add the fields you need

cemetery=form.save(commit=False)
cemetery.created_by=request.user
cemetery.date_created=timezone.now()
cemetery.save()

Upvotes: 2

Related Questions