Form validation in function views - django

Is there any difference between the 2 parts of code?
def test(request):
if request.method == 'POST':
form = TestForm(request.POST)
if form.is_valid():
form.save()
title = form.cleaned_data.get('title') #<<--
print(title)
return redirect('blog-home')
else:
form = TestForm()
return render(request, 'blog/test.html', {'form': form})
def test(request):
if request.method == 'POST':
form = TestForm(request.POST)
if form.is_valid():
form.save()
title = request.POST.get('title') # <<--
print(title)
return redirect('blog-home')
else:
form = TestForm()
return render(request, 'blog/test.html', {'form': form})
Since both cases is part of form.is_valid() condition I believe it should be same right?

No, it does not necessary produce same result as cleaned_data documentation states
Each field in a Form class is responsible not only for validating
data, but also for “cleaning” it – normalizing it to a consistent
format. This is a nice feature, because it allows data for a
particular field to be input in a variety of ways, always resulting in
consistent output.

Related

Form Django can't update data

here's my code
i can't update my data if i used type "file"
My form can't be updated, I try print(form.error) but "this field requirement" appears, even though the form is filled out
views.py :
#login_required
def data_karyawan_edit(request, id):
karyawan = Karyawan.objects.get(id=id)
ar_divisi = Divisi.objects.all()
if request.method == 'POST':
form = KaryawanForm(request.POST, request.FILES, instance=karyawan)
print(form.errors)
if form.is_valid():
form.save()
messages.success(request, "Berhasil disimpan")
return redirect('data_karyawan')
else:
form = KaryawanForm()
return render(request, "data_karyawan/edit.html", {'karyawan': karyawan, 'ar_divisi': ar_divisi})

Django, problem with render request: "The view main.views.licz didn't return an HttpResponse object. It returned None instead."

I'am trying to do a website and I have problem with uploading the file. On admin site I can upload and import any file but when I create view, I get this:
"The view main.views.licz didn't return an HttpResponse object. It returned None instead."
Here is the code from main.models:
class Plik(models.Model):
file = models.FileField(upload_to='uploads/')
Code from forms.py:
class upload(forms.Form):
title = forms.CharField(max_length=50)
file = forms.FileField()
And code from views.py:
def licz(request):
if request.method == "POST":
form = upload(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect("main/licz.html", {"form":form})
else:
form = Plik()
return render(request, "main/licz.html", {"form":form})
Plz I am trying to solve this like 5 days...
def licz(request):
if request.method == "POST":
form = upload(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect("main/licz.html", {"form":form})
else:
form = Plik()
return render(request, "main/licz.html", {"form":form})
# if request is GET, python will execute this part of the function
Your livz function does not return anything on a GET request.
If no return statement is given, Python will return None.
The return render(...) is only executed on a POST request (when the form is submitted) with invalid form.
You need to also render your page on other request method.
A typical form view should look like the following (pay attention to the indent):
def form_view(request):
if request.method == 'POST':
form = MyForm(data=request.POST)
if form.is_valid():
# do stuff with the form
return HttpResponseRedirect('/success-url')
else:
form = MyForm()
return render('my-template', {'form': form})
Pay attention to your conditions (if/else/...) and make sure your page return a response in every possible path the code execution takes.
def licz(request):
if request.method == "POST":
form = upload(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect("main/licz.html")
else:
form = Plik()
return render(request, "main/licz.html", {"form":form})

Form is not displaying ValidationError

It is not showing any validation error but reloading the empty form till the all form fields behavior validation.
views.py
def Leave_management(request):
if request.user.is_superuser:
form = LeaveForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
if not request.user.is_superuser and not request.user.is_anonymous:
form = LeaveForm(request.POST or None)
form.fields['status'].disabled = True
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
template
<hr><h1>Leave Application</h1><hr>
<form method="post">
{% csrf_token %}
{{form|crispy}}
<input type="submit" value="submit" >
</form>
The culprit is the fact that you create a new LeaveForm:
def Leave_management(request):
if request.user.is_superuser:
form = LeaveForm(request.POST or None)
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
if not request.user.is_superuser and not request.user.is_anonymous:
form = LeaveForm(request.POST or None)
form.fields['status'].disabled = True
if form.is_valid():
form.save()
return redirect('leave_list')
else:
form = LeaveForm()
return render(request, 'leave_management.html', {'form': form})
So you created a new form that of course does not know anything about the values you have send through it.
But furthermore the request.POST or None pattern is not a good idea either: it will result in the fact that if you have a form that does not per se needs data, then the POST request can never get done properly, since then the form sees a None, and assumes that you construct the form for the first time.
The idea is to feed the request.POST to the form in case this is a post request, like:
def leave_management(request):
if request.method == 'POST':
form = LeaveForm(request.POST)
else:
form = LeaveForm()
if not request.user.is_superuser and not request.user.is_anonymous:
form.fields['status'].disabled = True
if form.is_valid():
form.save()
return redirect('leave_list')
else:
return render(request, 'leave_management.html', {'form': form})
Furthermore we here deduplicate the codepaths. Whether the user is a super user has indeed some impact, but there is no reason to write the remainder of the procedure all in two separate codepaths. We can make an if statement that does the job, and then let the codepaths join again.
Furthemore we thus always construct one form (in the first if statement). Furthermore the name of view functions (like all functions) typically only use lowercase.

Saved model is None

So i have a model that i'm trying to save using a form which submits successfully, but in the Admin the object value None. I know the problem is in the views but i can't figure it out. Here's my code:
Views.py
def profilecreate(request):
if request.method == 'GET':
form = ProfileForm()
else:
form = ProfileForm(request.POST)
if form.is_valid():
description = form.cleaned_data['description']
caption= form.cleaned_data['caption']
photo = form.cleaned_data['photo']
profile = Profile.objects.create(description=description, caption=caption, photo=photo)
return HttpResponseRedirect(reverse('profile-id', kwargs={'profile_id': profile.id}))
return render(request, 'profile_form.html', {'form': form})
Someone please assist
Second view attempt
def profilecreate(request):
# if this is a POST request we need to process the form data
if request.method == 'POST':
# create a form instance and populate it with data from the request:
form = ProfileForm(request.POST)
# check whether it's valid:
if form.is_valid():
photo = form.cleaned_data['photo']
description = form.cleaned_data['description']
caption = form.cleaned_data['caption']
form.save(commit=True)
return HttpResponseRedirect('/')
# if a GET (or any other method) we'll create a blank form
else:
form = ProfileForm()
return render(request, 'profile_form.html', {'form': form})

Setting value of a form field in Django

I'm attempting to modify a field after the user has submitted the form. I've found several pieces of code online, but none seem to work. Below is my attempt in views.py. Any guidance would be greatly appreciated.
def newlisting(request):
if request.method == "POST":
form = ListingsForm(request.POST)
if form.is_valid():
form.cleaned_data['condition'] = 1 #form.condition = 1 also fails
form.save()
return redirect('/listings/')
else:
form = ListingsForm()
return render(request, 'newlisting/newlisting.html', {'form':form})
you can do like:
def newlisting(request):
if request.method == "POST":
form = ListingsForm(request.POST)
if form.is_valid():
obj = form.save(commit=False)
obj.condition = 1
obj.save()
return redirect('/listings/')
else:
form = ListingsForm()
return render(request, 'newlisting/newlisting.html', {'form':form})