Визуализировать поле ForeignKey как текстовое поле в форме, но сохранить поведение внешнего ключа - PullRequest
0 голосов
/ 09 ноября 2018

Этот вопрос выглядит глупым и простым, но я действительно не могу понять это. У меня есть модель с полем внешнего ключа для другой модели, скажем:

class Parent:
  name = models.CharField()

class Child:
  name = models.CharField()
  e_id = models.IntegerField()
  parent = models.ForeignKey(Parent)

Я рендерил экземпляры Child с формами defalt django, без каких-либо дополнений. Я использую inlineformset_factory(Parent, Child, extra=1), если это важно.

И ключевой момент: django отображает parent (который является внешним ключом) в качестве раскрывающегося ввода. И мне нужно показать идентификатор родителя в форме в виде простого ввода текста, а не раскрывающегося списка. Но я хочу сохранить все поведение внешнего ключа и заставить django проверять, что содержимое входных данных parent_id является действительным и существующим идентификатором патентной модели.

Я пытался создать ChildForm следующим образом:

class ChildForm(django.forms.ModelForm):
    class Meta:
        model = Child
        fields = ('name', 'e_id', 'parent')

    parent = CharField(label=_("Parent"), required=True)

И используйте это так:

inlineformset_factory(Parent, Child, extra=1)

И он отображается как charfield, как я хочу. Но здесь больше нет валидации и умных преобразований id в экземпляр. Если я пишу неверный parent_id, я получаю «Невозможно назначить« u'21 »»: «Children.parent» должен быть экземпляром «Parent». » ошибка.

Так что я чувствую, что делаю что-то не так. Я нашел этот ответ ( Поле базы данных ForeignKey в Django не как раскрывающийся список ), но похоже, что это какая-то мартышка, и я не уверен, что это django-способ сделать это.

Так каков правильный путь? Я использую Django 1.6.

1 Ответ

0 голосов
/ 09 ноября 2018

Здесь вам нужно изменить виджет, а не поле. Виджеты - это то, что отвечает за вывод входных данных в HTML, тогда как поля отвечают за проверку. Так что вам просто нужно:

class ChildForm(django.forms.ModelForm):
    class Meta:
        model = Child
        fields = ('name', 'e_id', 'parent')
        widgets = {'parent': forms.TextInput}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...