#jquery #ajax #django #radio-button
#jquery #ajax #django #переключатель
Вопрос:
у меня есть простая форма, которая включает в себя текстовые поля и переключатели, где система принимает пользовательский ввод и добавляет новую запись в базу данных.
проблема в том, что как только пользователь заполняет форму и нажимает на кнопку отправки, система отображает приведенную ниже ошибку:
верните базу данных.Cursor.execute(self, запрос, параметры) django.db.utils.Ошибка целостности: НЕ удалось выполнить ограничение NOT NULL: map_person.gender
models.py
class Person(models.Model):
boolChoice = (
("M","Male"),("F","Female")
)
name = models.CharField(max_length=50)
date = models.DateField()
description = models.TextField()
gender = models.CharField(max_length=10, choices= boolChoice)
def __str__(self):
return str(self.name)
addPerson.html
{% extends 'base.html' %}
{% block content %}
<div class="hero__content">
<form method="POST" class="form-style-9">{% csrf_token %}
{{ form.as_p }}
<ul>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<li>
<h2>Add Member</h2>
</li>
<li>
<input type="text" name="name" class="field-style field-split align-right" placeholder= "enter ur name " id="name"/>
</li>
<li>
<input type="date" name="date" class="field-style field-full align-none" placeholder= " your birthdate" id="birthdate" />
</li>
<li>
<input type="radio" name="gender" value="male"> Male<br>
<input type="radio" name="gender" value="female"> Female<br>
</li>
<li>
<textarea name="description" class="field-style" placeholder= "introduce yourself " id="description"></textarea>
</li>
<li>
<input type="submit" class="field-style field-full align-none" id="save" value="ADD" />
<script type="text/javascript">
$(function(){
$('#save').on('click',function(e){
e.preventDefault()
name=$('#name').val()
birthdate=$('#birthdate').val()
description=$('#description').val()
radioValue = $("input[name = 'gender']:checked").val()
if (radioValue){
alert("radioValue =", radioValue)
}
alert("name =", name)
alert("date =", birthdate)
alert("desc =", description)
$.ajax({
url:'/addperson/',
method:'POST',
data: {
na:name,
bi:birthdate,
de:description,
ra:radioValue
},
headers:{
'X-CSRFToken':'{{csrf_token}}'
}
}).done(function(msg) {
document.location = "/home.html"
alert('ﻟﻘﺪ ﺗﻢّ ﺣﻔﻆ اﻟﻤﻌﻠﻮﻣﺎﺕ')
}).fail(function(err){
alert('ﻟﻢ ﻳﺘﻢ اﻟﺤﻔﻆ')
})
})
})
</script>
</li>
</ul>
</form>
</div>
{% endblock %}
views.py
def addperson(request):
print("request method = " , request.method)
if request.method == "POST":
name = request.POST['na']
birthdate = request.POST['bi']
description=request.POST['de']
radiovalue=request.POST['ra']
person=Person.objects.create(
name=name,
date=birthdate,
description=description
)
person.save()
return render(request,'./home.html')
else:
print("this is a get METHOD")
Ответ №1:
Ну, когда вы создаете person, вы не задаете пол, поэтому ограничение NOT NULL.
person=Person.objects.create(
name=name,
date=birthdate,
description=description,
# set gender here
)
И лучше разделить ваши html-файлы и файл javascript.
Точка с запятой в конце ваших строк в javascript также является хорошей практикой.
Важно ли здесь выполнение вызова ajax? Потому что было бы намного проще и правильнее использовать django.forms.ModelForm
для того, что вы делаете (в качестве перенаправления вашего ajax-вызова при успешном выполнении). Если вы хотите, чтобы страница не обновлялась при отправке, то ajax — хороший вариант.
Комментарии:
1. хорошо, я добавил пол, но теперь ошибка такова:
django.core.exceptions.ValidationError: ["'male' value must be either True or False."]
в модели я указал пол как BooleanField2. я вижу, что в ваших вариантах выбора у вас есть M и F, поэтому в вашем
value
вместо male и female укажите M и F. Или вы можете создать функцию в своей модели. Если мужской, то True или False. Ну, я действительно не понимаю, что такое истинный пол или ложный пол3. ваш выбор неверен. Вы должны указать истинное значение и ложное значение при выборе, например, для вашего поля gender :
BOOL_CHOICES = ((True, 'Yes'), (False, 'No'))
например. Все еще думаю, что booleanfield для определения пола — плохая идея для логики. Просто создайте обычное символьное поле с двумя возможными вариантами. Это будет более откровенно, чем наличие true или false в ваших данных4. я изменил логическое значение на charfield, и теперь оно сохраняет все введенные пользователем данные, кроме пола. взгляните на вопрос, я отредактирую модель