Django: избегайте ограничения типа данных

У меня есть класс с атрибутом IntegerField. В его ModelForm, в поле этого атрибута, мне нужно отправить строку, которая позже будет хранить целое число после его обработки в представлении. Проблема в том, что Django не позволяет этого, и когда я использую form.cleaned_data.get('myattr'), он говорит, что это неправильно, потому что это должно быть целое число.

class Student(models.Model):
    teacher = models.IntegerField(null=False) # I'm saving teacher's key here


class Teacher(models.Model:
    name = models.CharField(max_length= 50, null=False)
    key = models.IntegerField(null=False)


class StudentForm(forms.ModelForm):
    teacher = forms.ModelChoiceField(queryset=Teacher.objects.all(), label='Select the teacher')

Таким образом, когда пользователь выбирает учителя ученика, в этом поле выбора будут отображаться имена доступных учителей. Но в модели он будет хранить свой ключ, которым я управляю в поле зрения.

просмотров.py:

teacher = form.cleaned_data.get('teacher') # it has the name
teacher = Teacher.objects.get(name=teacher).key # getting the key in order to store an Integer, but Django is banning my code before anyway.

Как я могу справиться с этим, не меняя тип данных модели?

Я даже добавил to_field_name в поле формы со значением ключа Учителя.

ModelChoiceField предназначен для выбора объекта, на который ссылается ForeignKey в модели. Поэтому ему нужен pk (первичный ключ) экземпляра Teacher в качестве входных данных. Почему бы вам не использовать ForeignKey для поля teacher? Вы слишком усложняете свой код так, как делаете это сейчас.

dirkgroten 08.04.2019 15:34

Потому что я переношу настольное приложение в веб-приложение и мне нужно сохранить структуру таблиц. Работа вещи

Gonzalo Dambra 08.04.2019 15:36

Затем убедитесь, что ваша HTML-форма публикует pk как значение (в <option> поля <select> есть видимые значения, для которых вы можете использовать имя, и фактические опубликованные значения, для которых вы должны использовать pk). Если вы используете {{ form.teacher }} в своем шаблоне, это должно сработать.

dirkgroten 08.04.2019 15:37

Что ж, если я проверю элемент, в теге <option> он показывает pk в атрибуте значения и отображает имя. Так как я использовал to_field_name с pk. Я не могу понять, почему представление получает строку из метода публикации.

Gonzalo Dambra 08.04.2019 15:40

какую именно ошибку вы получаете? покажите нам свой шаблон, трассировку ошибок и содержимое request.POST. Обратите внимание, что все всегда публикуется как строка, даже целые числа. Они возвращаются к тому, что необходимо, когда поле формы извлекает значение (и очищает его)

dirkgroten 08.04.2019 15:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одним из лучших подходов здесь будет установка отношений между вашим учеником и учителем (используя ключ foregin).

В зависимости от потребности вашего приложения вот как это сделать:

Если у одного ученика может быть несколько учителей и у одного учителя может быть несколько учеников: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_many/

Если у одного ученика может быть только один учитель, но у учителя может быть несколько учеников: https://docs.djangoproject.com/en/2.1/topics/db/examples/many_to_one/

Если у одного ученика может быть только один учитель, а у одного учителя может быть только один ученик: https://docs.djangoproject.com/en/2.1/topics/db/examples/one_to_one/

Это лучший способ справиться с этим. Затем вам нужно только сопоставить модель Student в форме Student, например:

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        #you can add the list of all the fields you want there
        fields = ['teacher']

Одним дополнительным шагом будет определение метода улулong> модели, чтобы Django связал строковое представление вашей модели в вашей форме (здесь для удобного способа отображения учителя в форме ученика).

class Teacher(models.Model):
    name = models.CharField(max_length= 50, null=False)
    #place other fields here ...

    def __str__(self):
        #if you print a Teacher django will return the string corresponding to the teacher name
        return self.name

Я очень ценю ваш ответ. Это полезно, но не в этом случае, поскольку я переношу настольное приложение в веб-приложение, а компания хочет сохранить структуру своих таблиц. Вот почему я пытаюсь управлять этим каким-то другим способом. Если бы я мог просто заставить код игнорировать тип данных...

Gonzalo Dambra 08.04.2019 15:56

А что, если вы добавите метаописание Студента в студенческую форму. Затем используйте Select как виджет формы и внутри в этом заполните выбор из запроса к базе данных?

Ben Boyer 08.04.2019 16:09

Другие вопросы по теме