Django form.is_valid() возвращает false
Я пытаюсь обновить экземпляр из таблицы Author, Но form.is_valid всегда возвращает false.
Я добавил enctype="multipart/form-data" в шаблон формы, В представлении я также получаю файлы, но форма не проверяется.
Я ничего не пропустил?
Это раздел просмотров.
def update(request,something,id):
something=str(something).lower()
if something=='author':
author=Author_model.objects.get(id=id)
if request.method=='GET':
return render(request,'update_author.html',{'author':author})
else:
form = Author_form(request.POST, request.FILES,instance=author)
print('form.is_valid()',form.is_valid())
if form.is_valid():
image_path = author.image_document.path
if os.path.exists(image_path):
os.remove(image_path)
form.save()
return redirect('http://127.0.0.1:8000/bookdb/author/')
Это шаблон.
<form action="" method="post" enctype="multipart/form-data">
<center>
<h2>Update Author</h2><hr>
<table>
<tr>
<td>Solutation </td>
<td>: <select name="" id="">
<option value="{{author.solutaion}}">{{author.solutaion}}</option>
<option value="Mr">Mr</option>
<option value="Ms">Ms</option>
<option value="Dr">Dr</option>
</select></td>
</tr>
<tr><td >Name </td>
<td>: <input type="text" value="{{author.name}}"></td></tr>
<tr>
<td>Email </td>
<td>: <input type="email" value="{{author.email}}"></td>
</tr>
<tr>
<td>Headshot {{author.headshot}}</td>
<td><img src="{{author.headshot.url}}" alt="Image not found" width="100" height="60"></td>
<td>: <input type="file"></td>
</tr>
</table><br>
<button type="submit">Submit</button>
</center>
{%csrf_token%}
</form>
Можете ли вы показать класс вашей формы? В случае, если проблема связана с валидацией формы, важно поделиться.
Вы настроили form inputs так, что они не могут соответствовать вашим form fields на стороне сервера!
Поэтому form_valid() всегда False.
Я обновляю ваш шаблон:
<form action="" method="post" enctype="multipart/form-data">
<center>
<h2>Update Author</h2><hr>
<table>
<tr>
<td>Solutation </td>
<td>: <select name="solutaion" id="" >
<option value="{{author.solutaion}}">{{author.solutaion}}</option>
<option value="Mr">Mr</option>
<option value="Ms">Ms</option>
<option value="Dr">Dr</option>
</select></td>
</tr>
<tr><td >Name </td>
<td>: <input type="text" value="{{author.name}}" name="name"></td></tr>
<tr>
<td>Email </td>
<td>: <input type="email" value="{{author.email}}" name="email"></td>
</tr>
<tr>
<td>Headshot {{author.headshot}}</td>
<td><img src="{{author.headshot.url}}" alt="Image not found" width="100" height="60"></td>
<td>: <input type="file" name="headshot"></td>
</tr>
</table><br>
<button type="submit">Submit</button>
</center>
{%csrf_token%}
</form>
Также посмотрите на свой браузер DevTools, чтобы убедиться в их значениях перед получением запроса.
Поскольку вы используете пользовательский html, вам нужно установить name атрибуты вашей html в соответствии с field именем вашей модели. Таким образом, form.is_valid() всегда возвращает False, если name атрибут отличается или не указан.
<form action="/update/author/{{author.id}}" method="post" enctype="multipart/form-data"> #<--- Here I set `author` in place of `something` add values accordingly
<center>
<h2>Update Author</h2><hr>
<table>
<tr>
<td>Solutation </td>
<td>: <select name="solutaion" id="">
<option value="{{author.solutaion}}">{{author.solutaion}}</option>
<option value="Mr">Mr</option>
<option value="Ms">Ms</option>
<option value="Dr">Dr</option>
</select></td>
</tr>
<tr><td >Name </td>
<td>: <input type="text" name="name" value="{{author.name}}"></td></tr>
<tr>
<td>Email </td>
<td>: <input type="email" name="email" value="{{author.email}}"></td>
</tr>
<tr>
<td>Headshot {{author.headshot}}</td>
<td><img src="{{author.headshot.url}}" alt="Image not found" width="100" height="60"></td>
<td>: <input type="file" name="headshot"></td>
</tr>
</table><br>
<button type="submit">Submit</button>
</center>
{%csrf_token%}
</form>