Можно ли «заполнить» такую ​​форму? - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу проверить форму. Он работает, но тест не работает.

Одно поле этой формы заполнено функцией 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

1 Ответ

0 голосов
/ 03 ноября 2019

Я не знаю, почему и как, но этот код работает:

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.syntax.add(nome)
    form = NameForm({'nametype': nome.id, 'gender': maschio.id,
                     'name': 'Remo', 'namelanguage': romani.id})
    form.fields['nametype'].initial = nome.id
    form.save()
    self.assertEqual(Name.objects.all().count(), 1)
    my_name = Name.objects.first()
    self.assertEqual(my_name.name, 'remo')
    self.assertEqual(my_name.nametype, nome)
    self.assertEqual(my_name.gender, maschio)
    self.assertEqual(my_name.namelanguage, romani)

Любой комментарий будет оценен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...