Я хочу проверить форму. Он работает, но тест не работает.
Одно поле этой формы заполнено функцией javascript. Я могу использовать селен для этого, но я не хочу, потому что это создает проблемы, а также я хочу изолировать тест.
Итак, я вызываю форму в своем тесте, а затем создаю выбор(это то, что должен делать javascript), затем я устанавливаю значения полей.
Мой models.py
:
class Name(models.Model):
name = models.CharField(_('nome'), max_length=50, default='')
namelanguage = models.ForeignKey(
NameLanguage, related_name='%(app_label)s_%(class)s_language',
verbose_name=_('linguaggio'), on_delete=models.PROTECT)
nametype = models.ForeignKey(
NameType, related_name='%(app_label)s_%(class)s_tipo',
verbose_name=_('tipo'), on_delete=models.PROTECT)
gender = models.ForeignKey(
Gender, related_name='%(app_label)s_%(class)s_gender',
verbose_name=_('sesso'), on_delete=models.PROTECT,
blank=True, null=True)
usato = models.PositiveSmallIntegerField(_('usato'), default=0)
approved = models.BooleanField(null=True, blank=True, default=False)
def save(self, *args, **kwargs):
self.name = format_for_save_name(self.name)
to_save = check_gender_name(self)
if not to_save:
return
else:
super(Name, self).save(*args, **kwargs)
def format_for_save_name(name):
myname = name.lower().strip()
if myname[0] not in "abcdefghijklmnopqrstuvwxyz#":
myname = '#' + myname
return myname
Мой form.py
:
class NameForm(forms.ModelForm):
class Meta:
model = Name
fields = ['namelanguage', 'nametype', 'gender', 'name', 'usato',
'approved']
widgets = {
'gender': forms.RadioSelect(),
'usato': forms.HiddenInput(),
'approved': forms.HiddenInput(),
}
My test_form.py
:
def test_form_validation(self):
maschio = Gender.objects.create(name_en='Male', name_it='Maschio')
nome = NameType.objects.create(name_en='Name', name_it='Nome')
romani = NameLanguage.objects.create(
name_en='Romans', name_it='Romani')
romani.sintassi.add(nome)
form = NameForm()
form.fields['nametype'].disabled = False
form.fields['nametype'].choices = [(nome.id, nome)]
form.fields['nametype'].initial = nome.id
form.fields['gender'].initial = maschio.id
form.fields['name'].initial = 'Bill'
form.fields['namelanguage'].initial = romani.id
# form.fields['usato'].initial = 0
# form.fields['approved'].initial = False
print('1', form)
# self.assertTrue(form.is_valid())
form.save()
print('1', form)
дает форму без ошибок, но form.is_valid
равно False
и (когда закомментировано) form.save()
выдает ошибку, когда модель пытаетсясохранить поле имени:
if myname[0] not in "abcdefghijklmnopqrstuvwxyz#":
IndexError: string index out of range
Это потому, что имя является пустой строкой, и все же мой print('1', form)
дает все поля с выбранными правильными параметрами и, в частности, поле имени не пустое, но имеет value="Bill"
:
<td><input type="text" name="name" value="Bill" maxlength="50" autofocus="" required id="id_name">
Редактировать. Я пытался избежать этой проверки, и проблема аналогична для других полей: они выглядят нормально на print('1', form)
, но они неприйти к form.save()
, например, в моем print('1', form)
у меня есть:
<tr><th><label for="id_namelanguage">Linguaggio:</label></th><td><select name="namelanguage" required id="id_namelanguage">
<option value="">---------</option>
<option value="1" selected>Romani</option>
, так что, похоже, я выбрал опцию, но затем я получаю эту еrror:
django.db.utils.IntegrityError: NOT NULL constraint failed: lists_name.namelanguage_id