0

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'

2 Answers 2

2

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()
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks a lot for the answer! I am a bit confused now, I tried different scenarios but none worked. Do you mean to ignore those 4 lines you mentioned or keep them and remove the rest? How would you rewrite the views.py?
0

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})

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.